解题思路:

这其实动态规划算法的一道 入门入门入门 级的题,又称为数塔。解法就是从下往上,两两比较,以样例为例。最下面的

4 5 2 6,先4和5比较,二者间大的数与上面的2相加。依次类推。

比较规整的代码链接:http://paste.ubuntu.com/26087872/(其实是我不知道怎么贴好点)




注意事项:

不要用递归!



参考代码:

#include <stdio.h>

#include <string.h>


int Max(int a, int b)

{

    if(a > b)

        return a;

    else

        return b;

}


int main(void)

{

    int n,i,j,m;

    int num[105][105]={0};

    int dp[105][105]={0};


    scanf("%d",&n);

    while(n)

    {

        scanf("%d",&m);

        for(i=0; i<m; i++)

        {

            for(j=0; j<=i; j++)

            {

                scanf("%d",&num[i][j]);

            }

        }

        for(j=0; j<m; j++)

        {

            dp[m-1][j] = num[m-1][j];

        }

        for(i=m-2; i>=0; i--)

        {

            for(j=0; j<=i; j++)

            {

                dp[i][j]=Max(dp[i+1][j],dp[i+1][j+1])+num[i][j];

            }

        }

        printf("%d\n",dp[0][0]);

        memset(num,0,sizeof(num));

        memset(dp,0,sizeof(dp));

        n--;

    }

    return 0;

}


点赞(3)
 

0.0分

3 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 2 条评论

shijilin1 3年前 回复TA
#include<stdio.h>

int max (int a, int b) {
    return a>b? a:b;
}

int main () {
    int n;
    scanf("%d", &n);
    while (n) {
        int num[100][100];
        int lineNum, i, j;
        scanf("%d", &lineNum);
        for(i = 0; i < lineNum; i ++) {
            for(j = 0; j < i+1; j ++) {
                scanf("%d", &num[i][j]);
            }
        }
        for(i = lineNum-2; i >= 0; i --) {
            for(j = 0; j <= i; j ++) {
                num[i][j] += max(num[i+1][j], num[i+1][j+1]);
            }
        }
        printf("%d\n", num[0][0]);
        n--;
    }

    return;
}
逻辑幻象 5年前 回复TA
#include<stdio.h>
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		int N,i;
		int a[10000];
		int n1;
		scanf("%d",&N);
		n1 = (N+1)*N/2;
		for(i=1;i<=n1;i++){
			scanf("%d",&a[i]);
		}
		int sum=0,k=1,sta=1;
		while(k<=N){
			int t=0;
			for(i=sta;i<sta+k;i++){
				if(a[i]>t){
					t=a[i];
				}
			}
			sum+=t;
			sta = sta+k;
			k=k+1;
		}
		printf("%d\n",sum);
	}
	return 0;
}
按照样例输入 得出 36
不知道哪里想错了