///Dp #include<stdio.h> #include<string.h> //fv数组保存的是题目中的输入数据,ans[i][j]表示i个花束用j个花瓶装的最大值,显然j>=i; ///状态转移方程为ans[i][j]=max{ans[i-1][i-1],ans[i-1][i], //ans[i-1][i+1],……,ans[i-1][j-1]}+fv[i][j]; //从状态转移方程可以看出,其实只需要2个v长度的数组就可以,利用循环数组,而输入数据也 //可以做到输入一行处理一行,所以空间上还是可以降低一大部分。 int fv[105][105]; int ans[105][105]; int main() { int v,f; while(scanf("%d%d",&f,&v)!=EOF) { int i,j,max; for(i=1;i<=f;i++) { for(j=1;j<=v;j++) scanf("%d",&fv[i][j]); } memset(ans,0,sizeof(ans)); for(i=1;i<=f;i++) { max=ans[i-1][i-1]; for(j=i;j<=v;j++) { if(ans[i-1][j-1]>max) max=ans[i-1][j-1]; ans[i][j]=max+fv[i][j]; } } max=-100; for(i=f;i<=v;i++) if(ans[f][i]>max) max=ans[f][i]; printf("%d/n",max); } return 0; }