首页 > 代码库 > codeforce problem 148 E
codeforce problem 148 E
题意: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 }
codeforce problem 148 E
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。