原题:
Description
7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1)
Input
Output
Sample Input
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
Sample Output
30
分析:
动态规划初涉~
源码:
#include<string.h> #include<stdio.h> #define N 200 int d[N][N]; int n; int a[N][N]; int p(int r,int j) { if(r==n) return d[r][j]; if(a[r+1][j]==0)//如果p(r+1,j)没有计算过 a[r+1][j]=p(r+1,j); if(a[r+1][j+1]==0)//如果p(r+1,j+1)没有计算过 a[r+1][j+1]=p(r+1,j+1); if(a[r+1][j]>a[r+1][j+1]) return a[r+1][j]+d[r][j]; else return a[r+1][j+1]+d[r][j];//可以省去else? } int main() { int m; scanf("%d",&n); //将a全部置成0;表示开始所有的a(r,j)都没有算过 memset(a,0,sizeof(a)); for(int i=1; i<=n; i++) { for(int j=1; j<=i; j++) { scanf("%d",&d[i][j]); } } printf("%d",p(1,1)); return 0; }
附:未优化(递归)代码——
#include<string.h> #include<stdio.h> #define N 200 int d[N][N]; int n; int p(int r,int k) { if(r==n) return d[r][k]; if(p(r+1,k)>p(r+1,k+1)) return p(r+1,k)+d[r][k]; else return p(r+1,k+1)+d[r][k]; } int main() { int m; scanf("%d",&n); for(int i=1; i<=n; i++) { for(int j=1; j<=i; j++) { scanf("%d",&d[i][j]); } } printf("%d",p(1,1)); return 0; }