这一道题是一道动态规划的题。但是这道题的转移方程要想到还是有一点点难度的,一般都会想到5维的dp,但是这道题用5维明显会超时,所以再推一下会发现只用4维就可以了。
接下来就直接上代码了
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
int f[50][50][50][50],a[500],b[6];
int main() {
int n,p,m;
cin>>n>>m;
for(int i=1; i<=n; i++)
cin>>a[i];
f[0][0][0][0]=a[1];
for(int j=1; j<=m; j++) {
cin>>p;
b[p]++;
}
for(int i=0; i<=b[1]; i++)
for(int j=0; j<=b[2]; j++)
for(int z=0; z<=b[3]; z++)
for(int k=0; k<=b[4]; k++) {
int l=i*1+j*2+z*3+k*4+1,mx=0;
if (i)
mx=max(f[i-1][j][z][k],mx);
if (j)
mx=max(f[i][j-1][z][k],mx);
if (z)
mx=max(f[i][j][z-1][k],mx);
if (k)
mx=max(f[i][j][z][k-1],mx);
f[i][j][z][k]=mx+a[l];
}
cout<<f[b[1]][b[2]][b[3]][b[4]];
}
本文介绍了一道原本看似需要五维动态规划解决的问题,通过优化思路,仅使用四维DP实现了高效求解。文章提供了完整的C++代码实现,展示了如何通过遍历不同状态并更新DP数组来达到最优解。
489

被折叠的 条评论
为什么被折叠?



