仍然是DP 要保证 第i行前面的所有行均有一个位置可以放花,所以要从对角线开始,保证其后面的位置至少有一个位置可以放花,所以 在v-(f-i-1) 处结束 #include <stdio.h> int A[101][101]; int memo[101][101]; int max=101*(-50); int f,v; int main(){ scanf("%d%d",&f,&v); for(int i=0;i<f;++i) for(int j=0;j<v;++j){ scanf("%d",&(A[i][j]) ); if(j>=i) memo[i][j]=A[i][j]; //从对角线开始以A[i][j]对memo[i][j]进行初始化 } for(int i=0;i<f;++i) for(int j=i;j<=v-(f-i-1);++j){ int t=-101*(50); for(int k=j-1;k>=i-1;--k){ //找出前一行从对角线位置开始到 v-(f-i-1) 位置的 memo[][]的最大值 if(memo[i-1][k]>t) t=memo[i-1][k]; } memo[i][j]+=t; } for(int j=f-1;j<v;++j) //找出最后一行memo[][]的最大值 即最优解 if(memo[f-1][j]>max) max=memo[f-1][j]; printf("%d/n",max); return 0; }