动态规划(解释见注释)
2025-09-02 19:27:36
发布于:上海
4阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define ins insert
#define pir pair<int,int>
#define x first
#define y second
#define minpq priority_queue<int,vector<int>,greater<int>>
#define maxpq priority_queue<int,vector<int>,less<int>>
#define endl '\n'
int n,m,k,p[5];
vector<int>cards;
vector<vector<vector<vector<int>>>>dp;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
cards.resize(n+10);
for(int i=1;i<=n;i++)cin>>cards[i];
for(int i=1;i<=m;i++){
cin>>k;
p[k]++;
}
p[1]++,p[2]++,p[3]++,p[4]++;
dp.resize(p[1]+10,vector<vector<vector<int>>>(p[2]+10,vector<vector<int>>(p[3]+10,vector<int>(p[4]+10))));
dp[0][0][0][0]=cards[1];
for(int a=1;a<=p[1];a++){
for(int b=1;b<=p[2];b++){
for(int c=1;c<=p[3];c++){
for(int d=1;d<=p[4];d++){
dp[a][b][c][d]=max({dp[a-1][b][c][d],dp[a][b-1][c][d],dp[a][b][c-1][d],dp[a][b][c][d-1]})
+cards[1+1*(a-1)+2*(b-1)+3*(c-1)+4*(d-1)];
}
}
}
}
cout<<dp[p[1]][p[2]][p[3]][p[4]];
return 0;
}
/*
dp[i][a][b][c][d]:走到第i格,a,b,c,d张1,2,3,4
dp[i][a][b][c][d]=max{dp[i-1][a-1][b][c][d],dp[i-2][a][b-1][c][d],dp[i-3][a][b][c-1][d],dp[i-4][a][b][c][d-1]}+a[i];
i=1+1*a+2*b+3*c+4*d;
降维:
dp[a][b][c][d]=max{dp[a-1][b][c][d],dp[a][b-1][c][d],dp[a][b][c-1][d],dp[a][b][c][d-1]}+a[1+1*a+2*b+3*c+4*d];
dp[0][0][0][0]=a[1];
*/
这里空空如也
有帮助,赞一个