题意:n排花盆,我们可选择m个,每排第一个数字为每排个数,然后给出每个花盆的价值,我们只能从左边或者右边取
思路:bag[i][j]表示第i行取j个花盆的最大价值,那么每行我们可得到取1个,2个。。。。的最大价值,相当于体积为j,价值为bag[i][j],
总容量为m个,这就有点像是背包了,dp[i][j]表示前i行取j个最大价值,不同的是这得一行一行取
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int dp[102][10005]; 5 int bag[102][10005]; 6 int t[103]; 7 int a[102][10005]; 8 9 int main(){ 10 int n,m; 11 scanf("%d%d",&n,&m); 12 for(int i=1;i<=n;i++){ 13 scanf("%d",&t[i]); 14 for(int j=1;j<=t[i];j++){ 15 scanf("%d",&a[i][j]); 16 a[i][j]+=a[i][j-1]; 17 } 18 } 19 //bag[i][j]表示第i行去除j个价值最大 20 for(int i=1;i<=n;i++){ 21 for(int j=1;j<=t[i];j++){ 22 for(int k=0;k<=j;k++){ 23 bag[i][j]=max(bag[i][j],a[i][k]+a[i][t[i]]-a[i][t[i]-(j-k)]); 24 } 25 } 26 } 27 28 for(int i=1;i<=n;i++){ 29 for(int j=m;j>=0;j--){ 30 for(int k=0;k<=t[i]&&k<=j;k++)//对于这一行的j容量,取当前为k体积的价值// 31 dp[i][j]=max(dp[i][j],dp[i-1][j-k]+bag[i][k]); 32 } 33 } 34 cout<<dp[n][m]<<endl; 35 }