codevs1068(dp)

题目链接: http://codevs.cn/problem/1068/

题意: 中文题诶~

思路: dp

用 dp[i][j][k][l] 表示取 i 个 1, j 个 2, k 个 3, l 个 4 时最大贡献为多少, 那么初始化为 dp[0][0][0][0] = v[1], 其中 v[i] 表示 i 这点的权值. 动态转移方程式为:

 int dis = i +  * j +  * k +  * l + ;
if(i) dp[i][j][k][l] = max(dp[i][j][k][l], dp[i - ][j][k][l] + v[dis]);
if(j) dp[i][j][k][l] = max(dp[i][j][k][l], dp[i][j - ][k][l] + v[dis]);
if(k) dp[i][j][k][l] = max(dp[i][j][k][l], dp[i][j][k - ][l] + v[dis]);
if(l) dp[i][j][k][l] = max(dp[i][j][k][l], dp[i][j][k][l - ] + v[dis]);

那么答案为 dp[a[1]][a[2]][a[3]][a[4]] 其中 a[i] 为 i 的数目.

代码:

 #include <iostream>
using namespace std; const int MAXN = ;
int dp[][][][], a[], v[MAXN]; int main(void){
int n, m, x;
cin >> n >> m;
for(int i = ; i <= n; i++){
cin >> v[i];
}
for(int i = ; i <= m; i++){
cin >> x;
a[x]++;
}
dp[][][][] = v[];
for(int i = ; i <= a[]; i++){
for(int j = ; j <= a[]; j++){
for(int k = ; k <= a[]; k++){
for(int l = ; l <= a[]; l++){
int dis = i + * j + * k + * l + ;
if(i) dp[i][j][k][l] = max(dp[i][j][k][l], dp[i - ][j][k][l] + v[dis]);
if(j) dp[i][j][k][l] = max(dp[i][j][k][l], dp[i][j - ][k][l] + v[dis]);
if(k) dp[i][j][k][l] = max(dp[i][j][k][l], dp[i][j][k - ][l] + v[dis]);
if(l) dp[i][j][k][l] = max(dp[i][j][k][l], dp[i][j][k][l - ] + v[dis]);
}
}
}
}
cout << dp[a[]][a[]][a[]][a[]] << endl;
return ;
}
上一篇:云平台Linux主机安装流程


下一篇:jenkins+git+maven搭建自动化部署项目环境