博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷$1541$ 乌龟棋 线性$DP$
阅读量:5064 次
发布时间:2019-06-12

本文共 1233 字,大约阅读时间需要 4 分钟。

  

 

Sol

f[i]表示走到第i个格子时获得的最大分数

发现转移与各个爬行卡片的数量有关,一共只有4种卡片

所以就把这四种卡片的已使用张数也放进状态,f[i][a][b][c][d]...

发现知道a,b,c,d后已得知i,所以减去i的一维,只剩下f[a][b][c][d]

综上,最终状态是f[a][b][c][d]表示1牌用了a张,2牌用了b张.....获得的最大分数

转移就枚举上一张用的是哪张牌转移即可

 

Code

1 #include
2 #include
3 #define go(i,u,v) for(register int i=u;i<=v;i++) 4 using namespace std; 5 int read() 6 { 7 int x=0,y=1;char c=getchar(); 8 while(c<'0'||c>'9') {
if(c=='-') y=-1;c=getchar();} 9 while(c>='0'&&c<='9') {x=(x<<3)+(x<<1)+c-'0';c=getchar();}10 return x*y;11 }12 int n,m,cd[5],sc[360],f[50][50][50][50];13 int main()14 {15 n=read();m=read();16 go(i,1,n) sc[i]=read();17 go(i,1,m) {
int x=read();cd[x]++;}18 f[0][0][0][0]=sc[1];19 go(a,0,cd[1]) go(b,0,cd[2])20 go(c,0,cd[3]) go(d,0,cd[4]){21 int x=a*1+b*2+c*3+d*4+1;22 if(a>0) f[a][b][c][d]=max(f[a][b][c][d],f[a-1][b][c][d]+sc[x]);23 if(b>0) f[a][b][c][d]=max(f[a][b][c][d],f[a][b-1][c][d]+sc[x]);24 if(c>0) f[a][b][c][d]=max(f[a][b][c][d],f[a][b][c-1][d]+sc[x]);25 if(d>0) f[a][b][c][d]=max(f[a][b][c][d],f[a][b][c][d-1]+sc[x]);26 }27 printf("%d",f[cd[1]][cd[2]][cd[3]][cd[4]]);28 return 0;29 }
View Code

转载于:https://www.cnblogs.com/forward777/p/11009589.html

你可能感兴趣的文章
(二)RAID技术
查看>>
clojure JavaFX程序uberjar打包卡死的问题
查看>>
time模块 random模块
查看>>
webform 简单的服务器控件。
查看>>
PHP之GD函数的使用
查看>>
游戏设计中的算法题——计算宝物升级所需的资源数
查看>>
Java面试题集(二)list与Map相关知识(1.2)
查看>>
对于拷贝构造函数和赋值构造函数的理解
查看>>
ubuntu server 安装
查看>>
安装和卸载C#写的 windows service
查看>>
XIB做适配(二)
查看>>
Spring依赖注入:注解注入总结
查看>>
卸载 linux http
查看>>
log4j2 使用
查看>>
MFC的两个问题
查看>>
我想在 2012 储备的技术
查看>>
利用WindowsPhone7_SDK_Full.rar_for_xp,在xp下安装sdk,部署xap软件的教程
查看>>
那些我希望在一开始使用 Zsh(oh-my-zsh) 时就知道的
查看>>
macos port总结
查看>>
C/C++内存分配
查看>>