NOIP2010 乌龟棋
题意简化
传送门
给定n个格子,每个格子均有其贡献,与m次前进(每次前进距离在14之间,顺序随机),1n最大化其价值
n<=350,m<=120
题解
先确定大致方向,显然是个背包
然后...
不妨设 f[a][b][c][d] 为用了a张1牌,b张2牌,c张3牌,d张4牌的最大答案
当前所在的位置就是 a+b∗2+c∗3+d∗4
接着暴力DP就好
代码
#include<bits/stdc++.h>
#define rnt register int
#define c f[c1][c2][c3][c4]
using namespace std;
int f[45][45][45][45],a[395],b1,b2,b3,b4,n,m;
int main()
{
cin>>n>>m;
for(rnt i=1;i<=n;i++)
cin>>a[i];
for(rnt i=1;i<=m;i++)
{
rnt x;cin>>x;
if(x==1)b1++;else if(x==2)b2++;else if(x==3)b3++;
else b4++;
}
f[0][0][0][0]=a[1];
for(rnt c1=0;c1<=b1;c1++)
for(rnt c2=0;c2<=b2;c2++)
for(rnt c3=0;c3<=b3;c3++)
for(rnt c4=0;c4<=b4;c4++)
{
long long k=1+c1+c2*2+c3*3+c4*4;
if(c1!=0)c=max(c,f[c1-1][c2][c3][c4]+a[k]);
if(c2!=0)c=max(c,f[c1][c2-1][c3][c4]+a[k]);
if(c3!=0)c=max(c,f[c1][c2][c3-1][c4]+a[k]);
if(c4!=0)c=max(c,f[c1][c2][c3][c4-1]+a[k]);
}
cout<<f[b1][b2][b3][b4];
}
嗯,就这样了...
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步