1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| //首先对 1 2 3 4 4种不同的卡片计数 //然后动态规划 卡片的数量,注意初始值为t【1】 #include<bits/stdc++.h> using namespace std; int dp[125][125][125][125]; //abcd 代表1 2 3 4 四种走法 int t[405]; int n,m; int num[5];//1 2 3 4 四种卡片的张数 int main() { cin>>n>>m; int i,j; for(i=1;i<=n;i++) { cin>>t[i];// 每种卡片的值 } for(i=1;i<=m;i++) { int x; cin>>x; num[x]++; } int a,b,c,d;// 1 2 3 4 四种卡片 dp[0][0][0][0]=t[1];// 非常重要,起始等于t1 for(a=0;a<=num[1];a++) { for(b=0;b<=num[2];b++) { for(c=0;c<=num[3];c++) { for(d=0;d<=num[4];d++) {
int dis=1+a*1+b*2+3*c+d*4;// 计算新位置,起始等于1 if(a!=0) dp[a][b][c][d]=max(dp[a-1][b][c][d]+t[dis],dp[a][b][c][d]); // a用一张 if(b!=0) dp[a][b][c][d]=max(dp[a][b-1][c][d]+t[dis],dp[a][b][c][d]); if(c!=0) dp[a][b][c][d]=max(dp[a][b][c-1][d]+t[dis],dp[a][b][c][d]); if(d!=0) dp[a][b][c][d]=max(dp[a][b][c][d-1]+t[dis],dp[a][b][c][d]); } } } } cout<<dp[num[1]][num[2]][num[3]][num[4]]<<endl; return 0; }
|