捡金币
来源:互联网 发布:什么软件看电子书免费 编辑:程序博客网 时间:2024/06/11 00:48
time:3s 难度:Day2 T3
长长的题面
这是一道好难的题。
正解是DP+单调队列。(蒟蒻不会啦,看了题解也迷迷糊糊)
我只写了一个裸的DP,期望值60分,意外惊喜地拿了80分,好开心。
我们枚举时间,f[t][i][j][k]表示第t秒站在(i,j),已经用了k次闪现所获得的最大金币数
转移方程见代码,还是比较容易理解的。(对于 t 我是从零开始存的)
时间复杂度:T*C*W*n*n ≈ 5*10^7 ,60%,3s大概是能过的
#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#define LL long long#define INF 1000000007using namespace std;int n,C,W,T,ans;int s[101][26][26];int f[101][26][26][151];//f[t][i][j][k]表示第t秒站在(i,j),已经用了k次闪现所获得的最大金币数 int MAX(int &x,int y){if(y>x) x=y;}//取大 bool judge(int x,int y){ if(x<=n&&x>=1&&y<=n&&y>=1) return 1; return 0;}int main(){ scanf("%d%d%d%d",&n,&C,&W,&T); for(int i=1;i<=T;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) scanf("%d",&s[i][j][k]); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) f[0][i][j][0]=s[1][i][j]; for(int t=1;t<T;t++) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=0;k<=W;k++) { MAX(f[t][i][j][k],f[t-1][i][j-1][k]+s[t+1][i][j]);//右走 MAX(f[t][i][j][k],f[t-1][i][j+1][k]+s[t+1][i][j]);//左走 MAX(f[t][i][j][k],f[t-1][i+1][j][k]+s[t+1][i][j]);//下走 MAX(f[t][i][j][k],f[t-1][i-1][j][k]+s[t+1][i][j]);//上走 MAX(f[t][i][j][k],f[t-1][i][j][k]+s[t+1][i][j]);//不动 for(int p=1;p<=C;p++)//闪现 { if(k-p>=0) { if(judge(i,j-p*2)) MAX(f[t][i][j][k],f[t-1][i][j-p*2][k-p]+s[t+1][i][j]); if(judge(i,j+p*2)) MAX(f[t][i][j][k],f[t-1][i][j+p*2][k-p]+s[t+1][i][j]); if(judge(i-p*2,j)) MAX(f[t][i][j][k],f[t-1][i-p*2][j][k-p]+s[t+1][i][j]); if(judge(i+p*2,j)) MAX(f[t][i][j][k],f[t-1][i+p*2][j][k-p]+s[t+1][i][j]); } } } } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=0;k<=W;k++) MAX(ans,f[T-1][i][j][k]); printf("%d",ans); return 0; }
阅读全文
1 0
- 捡金币
- 捡金币
- 小女孩捡金币
- 金币
- 金币
- 金币
- 金币
- POJ 小兔子捡金币
- OpenJudge_P2987 小兔子捡金币
- [openjudge2987]小兔子捡金币
- poj 4006:小兔子捡金币
- 【OpenJudge 2987 】小兔子捡金币
- Openjudge 2987 小兔子捡金币
- 【OpenJudge 2987】小兔子捡金币
- openjudge 2787 小兔子捡金币 模拟
- 【OpenJ 2987】T3 小兔子捡金币(小金币捡兔子)
- OpenJudge noi 2987 小兔子捡金币(模拟)
- openjudge noi 2987 小兔子捡金币(模拟)
- linux常用命令及常用快捷键
- js
- HDU 3374 String Problem(最小表达法+kmp)
- 为Android的apk应用程序文件加壳以防止反编译的教程
- JavaScript常见的排序算法(一)
- 捡金币
- 北京大学是否奇闻多?
- 浏览器F12小结
- java鬼混笔记:Hibernate:5、一对多关联(单向,双向)
- 和为S的两个数字
- ACPC Headquarters : AASTMT (Stairway to Heaven)
- setContentView源码解析(API25)
- 小易喜欢的序列
- rhel7 grub配置文件及排错root密码找回