hdu 2084 数塔
http://acm.hdu.edu.cn/showproblem.php?pid=2084 这是一道很简单的DP题 ,我觉得就是一种思想,从后面往前面每次找和最大的,把每个数更新,一直往上推就可以了。。。 我用了两种方法,一种的递归,一种递推 递推代码: #include <stdio.h> #include <string.h> #include <stdlib.h> int a[100][100]; void dp(int n) { for(int i=n-1;i>=0;--i) { for(int j=i;j>0;--j) { if(a[i][j]+a[i-1][j-1]<a[i-1][j-1]+a[i][j-1]) a[i-1][j-1]=a[i-1][j-1]+a[i][j-1]; else a[i-1][j-1]=a[i][j]+a[i-1][j-1]; //printf("%d ",a[i-1][j-1]); } //printf("\n"); } } int main() { int t,m; scanf("%d",&t); while(t--) { scanf("%d",&m); for(int i=0;i<m;++i) for(int j=0;j<=i;++j) scanf("%d",&a[i][j]); dp(m); printf("%d\n",a[0][0]); } system("pause"); return 0; } 递归代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> int a[102][102]; void dp(int n) { if(n==0) return ; for(int j=n;j>=0;--j) { if(a[n][j]+a[n-1][j-1]<a[n-1][j-1]+a[n][j-1]) a[n-1][j-1]=a[n-1][j-1]+a[n][j-1]; else a[n-1][j-1]=a[n][j]+a[n-1][j-1]; } dp(n-1); } int main() { int t,m; scanf("%d",&t); while(t--) { scanf("%d",&m); for(int i=0;i<m;++i) for(int j=0;j<=i;++j) scanf("%d",&a[i][j]); dp(m); printf("%d\n",a[0][0]);
} system("pause"); return 0; } |