点击打开链接
题意:
有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];
代码:
#include <bits/stdc++.h>using namespace std;const int maxn = 105;int n,m,t[maxn],a[maxn][maxn],bag[maxn][maxn];int dp[maxn][10001];int main(){ cin >> n >> m; for(int i=1; i<=n; i++){ cin >> t[i]; for(int j=1; j<=t[i]; j++){ cin >> a[i][j]; a[i][j] += a[i][j-1]; } } for(int i=1; i<=n; i++) for(int j=1; j<=t[i]; j++) for(int k=0; k<=t[i] && k<=j; k++) bag[i][j] = max(bag[i][j], a[i][j-k] + a[i][t[i]] - a[i][t[i]-k]); for(int i=1; i<=n; i++) for(int j=0; j<=m; j++) for(int k=0; k<=t[i] && k<=j; k++) dp[i][j] = max(dp[i][j],dp[i-1][j-k]+bag[i][k]); cout << dp[n][m] << endl;}
新闻热点
疑难解答