codevs1068乌龟棋-四维DP,五维如何缩减一维
我们从起点x开始暴力枚举所有决策
于是可以得到如下转移
void dfs(int x,int A,int B,int C,int D,int y)
{
if (x==n) {ans=max(ans,y);}
if (A) dfs(x+1,A-1,B,C,D,y+a[x+1]);
if (B) dfs(x+2,A,B-1,C,D,y+a[x+2]);
if (C) dfs(x+3,A,B,C-1,D,y+a[x+3]);
if (D) dfs(x+4,A,B,C,D-1,y+a[x+4]);
}
但是我们发现如果定义dp[A][B][C][D]为用了A,B,C,D张相应种类的牌所能达到的最大价值
或者我实际上定义的语义是剩余cnt[1]-A,cnt[2]-B,cnt[3]-C,cnt[4]-D,张相应种类的牌所能达到的最大价值,
那么按照我的语义,dp[A][B][C][D]=max(dp[A][B][C][D],
max(dp[A+1][B][C][D],dp[A][B+1][C][D],dp[A][B][C+1][D],dp[A][B][C][D+1])+a[A*1+B*2+C*3+D*4+1]);千万不要丢掉1,因为唯一的起点是1
不得不说。。样例感人。。因为我少了一个一。。默认起点是0,不明白这一点样例都过不了
但是其实更加精髓的是如果我们这么定义dp的语义,那么我们前面的dp的位置那一维就不必考虑,从已有的四维状态能推出位置
下面贴上180ms程序。。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring> using namespace std;
int n,m;
int a[405],cnt[5];
int dp[41][41][41][41];
int dfs(int A,int B,int C,int D){
if(dp[A][B][C][D]!=-1) return dp[A][B][C][D];
int p=0;
if(A<cnt[1]) p=max(p,dfs(A+1,B,C,D));
if(B<cnt[2]) p=max(p,dfs(A,B+1,C,D));
if(C<cnt[3]) p=max(p,dfs(A,B,C+1,D));
if(D<cnt[4]) p=max(p,dfs(A,B,C,D+1));
return dp[A][B][C][D]=p+a[A*1+B*2+C*3+D*4+1];//注意!唯一的起点是1不是0
}
int main(){
scanf("%d%d",&n,&m);
int i,x;
for(i=1;i<=n;++i) scanf("%d",a+i);
memset(cnt,0,sizeof(cnt));
for(i=1;i<=m;++i) {scanf("%d",&x);cnt[x]++;}
memset(dp,-1,sizeof(dp));
printf("%d\n",dfs(0,0,0,0));
return 0;
}
codevs1068乌龟棋-四维DP,五维如何缩减一维的更多相关文章
- 洛谷P1541 乌龟棋(四维DP)
To 洛谷.1541 乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游 ...
- P1541 乌龟棋 线性dp
题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行NN个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第NN格是终点,游戏要求玩家控制一个乌龟棋子 ...
- codevs1068乌龟棋
codevs1068乌龟棋 1068 乌龟棋 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamon 题目描述 Descrip ...
- P1541 乌龟棋(DP)
题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行NNN个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第NNN格是终点,游戏要求玩家控制一个乌龟 ...
- codevs1068 乌龟棋==洛谷P1541 乌龟棋
P1541 乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家 ...
- 洛谷$1541$ 乌龟棋 线性$DP$
Luogu CH Sol f[i]表示走到第i个格子时获得的最大分数 发现转移与各个爬行卡片的数量有关,一共只有4种卡片 所以就把这四种卡片的已使用张数也放进状态,f[i][a][b][c][d] ...
- Problem D: 乌龟棋【四维dp】
Problem D: 乌龟棋 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 24 Solved: 15[Submit][Status][Web Boa ...
- NOIP2010乌龟棋[DP 多维状态]
题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...
- 【洛谷】P1541 乌龟棋(四维背包dp)
题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...
随机推荐
- SpringMVC下关于静态资源访问
SpringMVC静态资源访问 聊一聊关于静态资源的访问问题 首先,我们要对web.xml里面的DispatcherServlet进行设置 <!-- 中央调度器--> <servle ...
- 阿里云VOD(三)
一.视频播放器 参考文档:https://help.aliyun.com/document_detail/125570.html?spm=a2c4g.11186623.6.1083.1c53448bl ...
- IDEA SSM+MAVEN+JWT 图书管理系统
压缩包内含有MAVEN,TOMCAT,需要手动对IDEA进行配置.同时也包含数据库文件. 项目搭载了swagger,可以方便地对接口进行测试 在开发的过程中我也进行了一些记录,可以参考https:// ...
- hessian-serialization
http://hessian.caucho.com/doc/hessian-serialization.html Table of Contents 1. Introduction2. Desig ...
- Git:.gitignore和.gitkeep文件的使用 让空文件夹被跟踪
Git:.gitignore和.gitkeep文件的使用 Git:.gitignore和.gitkeep文件的使用 https://majing.io/posts/10000001781172 .gi ...
- Python 代码的加密混淆
py 脚本编译成 c 文件(cython) 用 cython 将核心代码 py 模块文件转化成 .c 文件,再用 gcc 编译成 so(unix)文件,或者将其编译成 pyd(windows)文件. ...
- 实用 nginx.conf 用法大全
服务器拒绝非GET方式请求保障安全性,因为 DELETE.POST.PUT 是可以修改数据的. Nginx 解决方案 在 nginx.conf 配置文件的网站配置区域中添加如下代码片段: 非 GET ...
- 僵尸网络(botnet)概念浅析
僵尸程序 僵尸程序是用于构建僵尸网络以形成大规模攻击平台的恶意代码.僵尸网络是被黑客集中控制的计算机群,其核心特点是黑客能够通过一对多的命令与控制信道操纵感染僵尸程序的主机执行相同的恶意行为,如可同时 ...
- loj黑暗城堡
黑暗城堡 题目描述 你知道黑暗城堡有\(N\)个房间,M 条可以制造的双向通道,以及每条通道的长度. 城堡是树形的并且满足下面的条件: 设\(D_i\)为如果所有的通道都被修建,第i号房间与第1号房间 ...
- P95、P99.9百分位数值——服务响应时间的重要衡量指标
前段时间,在对系统进行改版后,经常会有用户投诉说页面响应较慢,我们看了看监控数据,发现从接口响应时间的平均值来看在500ms左右,也算符合要求,不至于像用户说的那么慢,岁很费解,后来观察其它的一些指标 ...