解题思路:
这其实动态规划算法的一道 入门入门入门 级的题,又称为数塔。解法就是从下往上,两两比较,以样例为例。最下面的
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;
}
0.0分
6 人评分
#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; }
#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 不知道哪里想错了
小九九 (C语言代码)浏览:568 |
点我有惊喜!你懂得!浏览:1274 |
C二级辅导-求偶数和 (C语言代码)浏览:632 |
C二级辅导-统计字符 (C语言代码)浏览:782 |
C语言程序设计教程(第三版)课后习题10.7 (C语言代码)浏览:549 |
C语言训练-立方和不等式 (C语言代码)浏览:779 |
简单的a+b (C语言代码)浏览:719 |
C语言训练-求s=a+aa+aaa+aaaa+aa...a的值 (C语言代码)浏览:636 |
C语言程序设计教程(第三版)课后习题8.4 (C语言代码)浏览:631 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:512 |