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格是终点,游戏要求玩家控制一个乌龟棋子从起 ...
随机推荐
- UI测试框架
1. 从上到下共分成4层: 用例层 组件管理层 元素管理层 公共数据层 2. 用例层: 将每条用例使用参数化, 公共参数存储到"公共数据层", 中间参数通过组件层传递 3. ...
- yml文件中${DB_HOST:localhost}的含义
引自:https://blog.csdn.net/chen462488588/article/details/109057342 今天学习eladmin项目中看到application-dev.yml ...
- CentOS 7.4通过rpm包离线安装 Mysql8.0并部署主从复制(附从库备份脚本)
一. 部署MySQL (两个节点都做) 下载 rpm包 wget https://goodrain-pkg.oss-cn-shanghai.aliyuncs.com/mysql8.rpm tar xv ...
- ROS教程(二):创建工作空间(图文)
ros教程:创建工作空间 目录 前言 一.工作空间? 二.创建一个工作空间 1.创建目录 2.编译 前言 使用catkin创建一个工作空间 一.工作空间? 在ROS系统下,我们所有的项目都放在一个工作 ...
- 安卓开发视频教程!想找工作的你还不看这份资料就晚了!Android校招面试指南
前言 准备面试其实已经准备了挺久了,当时打算面试准备了差不多以后,跟公司谈谈涨薪的事情,谈不拢的话,就年后直接找其他的公司.谁想到婚假还没休完,老板就在公司宣布了撤出上海的决定,愿意去深圳的就去,不愿 ...
- 抓包一张tcpdump小抄就够了
作者简介 李先生(Lemon),高级运维工程师(自称),SRE专家(目标),梦想在35岁买一辆保时捷.喜欢钻研底层技术,认为底层基础才是王道.一切新技术都离不开操作系统(CPU.内存.磁盘).网络等. ...
- cookie,session,token傻傻分不清
什么是认证(Authentication) • 通俗地讲就是验证当前用户的身份,证明"你是你自己"(比如:你每天上下班打卡,都需要通过指纹打卡,当你的指纹和系统里录入的指纹相匹配时 ...
- Java Socket InetAddress类 Socket DatagramPacket TCP、UDP示例
java.net :为实现网络应用程序提供类. InetAddress类 方法摘要 方法摘要 boolean equals(Object obj) : 将此对象与指定对象比较. byte[] getA ...
- Java——I/O相关练习代码
File文件的相关练习 文件操作的三种方式 文件的相关方法练习 文件创建删除操作 文件练习 FileReader读取文件 读取文件逐行读取 InputStreamReader字符输出流 换行输出 Bu ...
- Docker容器内中文乱码
Docker容器内中文乱码 一.通过Dockerfile解决中文乱码问题 方式二: 二.临时解决 方式二: 三.修改jre/lib/fonts下的字体 CSDN:黑猫_:Dockerfile 创建容器 ...