依旧是一道dp
大概是那天在讲dp?
数据范围依旧良心
dp[i][j]表示前i个花瓶里放j朵花的最大价值
转移方程
dp[i][j]=max(dp[i][j],dp[j+k-1][j-1]+a[j][j+k])
第j朵花放哪枚举一下,取最大值
还有一点就是观赏价值可能为负所以要赋初值为负极大
code
#include<cstdio> #include<algorithm> using namespace std; #define N 110 int a[N][N]; int dp[N][N]; void print(int i,int j) { if(j == 0) return ; for(int k = 0; k <= i - j; k++) if(dp[i][j] == dp[j + k - 1][j - 1] + a[j][j + k]) { print(j + k - 1,j - 1); printf("%d ",j + k); break; } } int main() { int f,v; scanf("%d%d",&f,&v); for(int i = 1; i <= f; i++) for(int j = 1; j <= v; j++) scanf("%d",&a[i][j]); for(int i = 1; i <= f; i++) dp[i][i] = dp[i - 1][i - 1] + a[i][i]; for(int i = 1; i <= v; i++) for(int j = 1; j <= f; j++) { dp[i][j] = -1*0x3f3f3f3f; for(int k = 0; k <= i - j; k++) dp[i][j] = max(dp[i][j],dp[j + k - 1][j - 1] + a[j][j + k]); } printf("%d ",dp[v][f]); print(v,f); return 0; }
写着写着就饿了(x【大雾
想吃狗粮(?