算法笔记 分数矩阵

题目

我们定义如下矩阵:
1/1 1/2 1/3
1/2 1/1 1/2
1/3 1/2 1/1
矩阵对角线上的元素始终是1/1,对角线两边分数的分母逐个递增。
请求出这个矩阵的总和。

Input

输入包含多组测试数据。每行给定整数N(N<50000),表示矩阵为N*N。当N=0时,输入结束。
Output

输出答案,结果保留2位小数。

思路

1.Time Limit Exceed 50

  • 计算每次矩阵的数,并且打表
  • 通过n-1的矩阵值推导求出n的矩阵值
  • 最后得到结果

代码:

#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
vector<double> save;
double count(int n){
    
    
    if(n==1){
    
    
        if(save.size()<n)
            save.push_back(1);
        return 1;
    }
    else{
    
    
        double res=0;
        if(save.size()>=n)
            res=save[n-1];
        else{
    
    
            double sum=0;
            for(int i=2;i<=n;i++){
    
    
                sum+=1/(double)i;
            }
            res=count(n-1)+2*sum+1;
            save.push_back(res);
        }
        return res;
    }
}
int main(){
    
    
    
    int n=0;
    while(scanf("%d",&n)!=EOF){
    
    
        if(n==0)
            break;
        double res=count(n);
        printf("%.2lf\n",res);
    }
    return 0;
}

2.Accepted100

  • 1/1

计算:1

1/1 1/2
1/2 1/1

计算:[(2*1+1*1/2)-2*1]2+21

1/1 1/2 1/3
1/2 1/1 1/2
1/3 1/2 1/1

扫描二维码关注公众号,回复: 12024918 查看本文章

计算:[(3*1+2*1/2+1*1/3)-3*1]*2+3*1

思路

  • 先计算上三角(不算对角线)
  • 再x2(因为有上下两个矩阵三角)
  • 最后加上对角线

代码:

#include <stdio.h>
#include <iostream>
using namespace std;

int main(){
    
    
    
    int n=0;
    while(scanf("%d",&n)!=EOF){
    
    
        if(n==0)
            break;
        double res=0;
        for(int i=0;i<n;i++)
            res+=(n-i)*1.0/(1.0+i);
        res-=n;
        res*=2;
        res+=n;
        printf("%.2lf\n",res);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Cindy_00/article/details/108690917