【正经题解】乌龟题
2024-03-15 10:18:09
发布于:美国
1阅读
0回复
0点赞
四个参数,表示当前使用了多少个一号牌,二号牌,三号牌,四号牌
那么当前位置可以用 * * * * 表示
[ ]表示 号牌的个数
根据题目所说 由于起点是 ,所以自动获得第 格的分数,所以 还要加上 [ ]
因为代码中的 加上的值是跳之后的值,所以在 外要加上 [ ]
#include<bits/stdc++.h>
using namespace std;
int n,m,a[25555],b[25555],sum[105],f[45][45][45][45];
int dfs(int n1,int n2,int n3,int n4){
if(f[n1][n2][n3][n4]) return f[n1][n2][n3][n4];
if(n1==sum[1]&&n2==sum[2]&&n3==sum[3]&&n4==sum[4])
return 0;
int where=n1*1+n2*2+n3*3+n4*4+1;
int dfs1=0;
if(n1<sum[1]) dfs1=max(dfs1,dfs(n1+1,n2,n3,n4)+a[where+1]);//牌够的情况下搜索取max
if(n2<sum[2]) dfs1=max(dfs1,dfs(n1,n2+1,n3,n4)+a[where+2]);
if(n3<sum[3]) dfs1=max(dfs1,dfs(n1,n2,n3+1,n4)+a[where+3]);
if(n4<sum[4]) dfs1=max(dfs1,dfs(n1,n2,n3,n4+1)+a[where+4]);
return f[n1][n2][n3][n4]=dfs1;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=m;i++)
scanf("%d",&b[i]),sum[b[i]]++;
printf("%d\n",dfs(0,0,0,0)+a[1]);
return 0;
}
这里空空如也
有帮助,赞一个