题意:
有n排花盆,每排有k个,然后有个人想扔m个花瓶,每个花瓶有个价值val
他只能选择每一排的最左边或者最右边扔
求扔的最大价值
思路: bag[i][j]表示第i排扔j个的最大价值, dp[i][j]表示前i排扔j个的最大价值,背包dp
转移:dp[i][j] = max(dp[i][j],dp[i-1][j-k]+bag[i][k]) 0<=k<=t[i];
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 105; 4 5 int n,m,t[maxn],a[maxn][maxn],bag[maxn][maxn]; 6 int dp[maxn][10001]; 7 8 int main(){ 9 cin >> n >> m; 10 for(int i=1; i<=n; i++){ 11 cin >> t[i]; 12 for(int j=1; j<=t[i]; j++){ 13 cin >> a[i][j]; 14 a[i][j] += a[i][j-1]; 15 } 16 } 17 18 for(int i=1; i<=n; i++) 19 for(int j=1; j<=t[i]; j++) 20 for(int k=0; k<=t[i] && k<=j; k++) 21 bag[i][j] = max(bag[i][j], a[i][j-k] + a[i][t[i]] - a[i][t[i]-k]); 22 23 for(int i=1; i<=n; i++) 24 for(int j=0; j<=m; j++) 25 for(int k=0; k<=t[i] && k<=j; k++) 26 dp[i][j] = max(dp[i][j],dp[i-1][j-k]+bag[i][k]); 27 28 cout << dp[n][m] << endl; 29 }