P3842-DP【黄】
想搜索到最后一层,就必得先完成前面层的搜索任务,这构成了对状态转移的启示,即当前层的DP值应该是此前层转移过来后得到的最佳值。
但这道题看数据范围应该不能用二维数组,抱着侥幸的心理我使用了动态二维数组,dpij表示以第i层第j个为终点时的答案,结果MLE了,喜提42分,详见CODE-1。
后来意识到(其实是瞥了一眼题解后立刻受启发,然后想到的...)从中间节点转移过去是等价于先从边界节点动到中间节点在下去移动的,换句话说不需要存储、记录、判断那么多的状态,只需要存2*n个值就可以,但好像我写假了,不知为什么只有七十多分,详见CODE-2
总结,用记搜思想或者“想搜索到最后一层,就必得先完成前面层的搜索任务”等方法判断出所需的DP的下标的含义,然后在写出状态转移方程,这是我自己归纳的思考DP问题的一种比较简单的思维路径,应该多用用
CODE-1
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <stack>
#include <queue>
#include <map>
#include <unordered_map>
#include <cmath>
//#define int long long
using namespace std;
int * dp[20000+2];
int n,L[20000+2],R[20000+2];
int dfs(int row,int col)
{
	if(col<L[row]||col>R[row])return 0;
	if(dp[row][col-L[row]]!=-1)return dp[row][col-L[row]];
	if(row==1)return dp[row][col-L[row]]=R[row]-1+R[row]-col;
	int ANS=99999999;
	for(int i=L[row-1];i<=R[row-1];i++)
	{
		if(i<=R[row]&&i>=L[row])
			ANS=min(ANS,dfs(row-1,i)+1+2*(R[row]-max(i,col))+2*(min(i,col)-L[row])+max(i,col)-min(i,col));
		else if(i>R[row]) ANS=min(ANS,dfs(row-1,i)+1+i-L[row]+col-L[row]);
		else if(i<L[row]) ANS=min(ANS,dfs(row-1,i)+1+R[row]-i+R[row]-col);
	}
	return dp[row][col-L[row]]=ANS;
}
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>L[i]>>R[i];
		dp[i]=new int[R[i]-L[i]+1];
		for(int j=0;j<R[i]-L[i]+1;j++)dp[i][j]=-1;//li~ri->0~ri-li
	}
	cout<<n-R[n]+dfs(n,R[n])<<endl;
	return 0;
}
	/*
	dfs(n,R[n]);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			printf("%3d",dfs(i,j));
		}
		cout<<endl;
	}*/
CODE-2
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <stack>
#include <queue>
#include <map>
#include <unordered_map>
#include <cmath>
#define int long long
using namespace std;
int dp[20000+2][3];
int n,L[20000+2],R[20000+2];
int dfs(int row,int col)//now col is left or right
{
	if(dp[row][col]!=-1)return dp[row][col];
	int ANS=1e16;
	if(col==1)//towards L[row]
	{
		//from L[row-1]
		if(L[row-1]<=R[row])
			ANS=min(ANS,dfs(row-1,1)+1+R[row]-L[row-1]+R[row]-L[row]);
		else
			ANS=min(ANS,dfs(row-1,1)+1+L[row-1]-L[row]);
		//from R[row-1]
		if(R[row-1]<=R[row])
			ANS=min(ANS,dfs(row-1,2)+1+R[row]-R[row-1]+R[row]-L[row]);
		else
			ANS=min(ANS,dfs(row-1,2)+1+R[row-1]-L[row]);
	}
	else//towards R[row]
	{
		//from L[row-1]
		if(L[row-1]<=L[row])
			ANS=min(ANS,dfs(row-1,1)+1+R[row]-L[row-1]);
		else
			ANS=min(ANS,dfs(row-1,1)+1+L[row-1]-L[row]+R[row]-L[row]);
		//from R[row-1]
		if(R[row-1]<=L[row])
			ANS=min(ANS,dfs(row-1,2)+1+R[row]-R[row-1]);
		else
			ANS=min(ANS,dfs(row-1,2)+1+R[row-1]-L[row]+R[row]-L[row]);
	}
	for(int i=L[row-1];i<=R[row-1]/2;i++)
	{
		if(i<=R[row]&&i>=L[row])
			ANS=min(ANS,dfs(row-1,2)+R[row-1]-i+1+2*(R[row]-max(i,col))+2*(min(i,col)-L[row])+max(i,col)-min(i,col));
		else if(i>R[row]) ANS=min(ANS,dfs(row-1,2)+1+i-L[row]+col-L[row]);
		else if(i<L[row]) ANS=min(ANS,dfs(row-1,2)+1+R[row]-i+R[row]-col);
	}
	return dp[row][col]=ANS;
}
signed main()
{
	scanf("%ld",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%ld%ld",&L[i],&R[i]);
		for(int j=0;j<3;j++)dp[i][j]=-1;//li~ri->0~ri-li
	}
	dp[1][1]=R[1]-1+R[1]-L[1];
	dp[1][2]=R[1]-1;
	cout<<min(n-R[n]+dfs(n,2),n-L[n]+dfs(n,1))<<endl;
	return 0;
}
	/*
	dfs(n,R[n]);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			printf("%3d",dfs(i,j));
		}
		cout<<endl;
	}*/
P3842-DP【黄】的更多相关文章
- 【洛谷 P3842】[TJOI2007]线段(DP)
		裸DP.感觉楼下的好复杂,我来补充一个易懂的题解. f[i][0]表示走完第i行且停在第i行的左端点最少用的步数 f[i][1]同理,停在右端点的最少步数. 那么转移就很简单了,走完当前行且停到左端点 ... 
- DP擎天
		DP! 黄题: 洛谷P2101 命运石之门的选择 假装是DP(分治 + ST表) CF 982C Cut 'em all! 树形贪心 洛谷P1020 导弹拦截 单调队列水题 绿题: 洛谷P1594 护 ... 
- BestCoder Round #89  02单调队列优化dp
		1.BestCoder Round #89 2.总结:4个题,只能做A.B,全都靠hack上分.. 01 HDU 5944 水 1.题意:一个字符串,求有多少组字符y,r,x的下标能组成等比数列 ... 
- FZU 1025 状压dp 摆砖块
		云峰菌曾经提到过的黄老师过去讲课时的摆砖块 那时百度了一下题目 想了想并没有想好怎么dp 就扔了 这两天想补动态规划知识 就去FZU做专题 然后又碰到了 就认真的想并且去做了 dp思想都在代码注释里 ... 
- 合并傻子//区间dp
		P1062 合并傻子 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 从前有一堆傻子,钟某人要合并他们~但是,合并傻子是要掉RP的...... 描述 在一个园 ... 
- [BZOJ 2165] 大楼 【DP + 倍增 + 二进制】
		题目链接:BZOJ - 2165 题目分析: 这道题我读了题之后就想不出来怎么做,题解也找不到,于是就请教了黄学长,黄学长立刻秒掉了这道题,然后我再看他的题解才写出来..Orz 使用 DP + 倍增 ... 
- codeforces284 div1 B:概率dp
		蛋疼的期末..好久没有A题了,,惭愧啊 昨晚打起精神准备做cf 结果竟然忘记注册了..拿学长号看了看题,今早起来补了一道dp 题目大意: 有n首歌,你需要边听边猜 对于第 i 首歌 每听一分钟你猜出它 ... 
- 2017广东工业大学程序设计竞赛初赛 题解&源码(A,水 B,数学 C,二分 D,枚举 E,dp F,思维题 G,字符串处理 H,枚举)
		Problem A: An easy problem Description Peter Manson owned a small house in an obscure street. It was ... 
- BZOJ 2595: [Wc2008]游览计划 [DP 状压 斯坦纳树 spfa]【学习笔记】
		传送门 题意:略 论文 <SPFA算法的优化及应用> http://www.cnblogs.com/lazycal/p/bzoj-2595.html 本题的核心就是求斯坦纳树: Stein ... 
- BZOJ 1004: [HNOI2008]Cards [Polya 生成函数DP]
		传送门 题意:三种颜色,规定使用每种颜色次数$r,g,b$,给出一个置换群,求多少种不等价着色 $m \le 60,\ r,g,b \le 20$ 咦,规定次数? <组合数学>上不是有生成 ... 
随机推荐
- springcloud 实体类使用@Builder@AllArgsConstructor两个注解后查询执行操作时报数据转换异常
			异常日志如下: org.springframework.jdbc.UncategorizedSQLException: Error attempting to get column 'DATA_SOU ... 
- LeetCode5716:好因子的最大数目(数学、快速幂)
			解题思路:因为primeFactors比较大,所以需要使用快速幂. class Solution: def quick_pow(self,base,x): ans = 1 while x>0: ... 
- TensorFlow C++ 初始化 Tensor 内存 到GPU 内存
			最近使用TensorFlow C++版本实现神经网络的部署,我通过GPU 处理得到网络的输入值,因此输入值在GPU内存上保存, TF 输入tensor 的调用语句为 Tensor inputTenso ... 
- 内核模块(.ko) 开发入门
			内核模块时指的是在操作系统内核中动态加载的一段代码,它可以扩展和增强操作系统的功能.内核模块通常用于为操作系统添加新的设备驱动程序.文件系统.网络协议栈等功能. 内核模块是以二进制形式存在的(*.ko ... 
- MES数据追溯常遇问题及解决方法
			MES数据追溯常遇问题及解决方法: 在实际数字化工厂MES应用过程,由于设计或使用不当,数据追溯过程中也可能会存在诸多问题,常遇问题包括:1. 数据质量问题 可能存在数据录入错误.数据缺失或不完整等情 ... 
- shutdown详解
			linux下shutdown命令详解 shutdown命令安全地将系统关机. 有些用户会使用直接断掉电源的方式来关闭linux,这是十分危险的.因为linux与windows不同,其后台运行着许多进程 ... 
- wangEditor出现初始化编辑器时候未传入任何参数,请查阅文档
			wangEditor出现初始化编辑器时候未传入任何参数,请查阅文档 出现的原因可能是你未在初始视图.元素未创建.created.模态框.弹窗.抽屉中使用,你应该在div元素创建了再执行初始渲染, 解决 ... 
- Tailscale 基础教程:Headscale 的部署方法和使用教程
			Tailscale 是一种基于 WireGuard 的虚拟组网工具,它在用户态实现了 WireGuard 协议,相比于内核态 WireGuard 性能会有所损失,但在功能和易用性上下了很大功夫: 开箱 ... 
- shared_preferences缓存
			封装 import 'dart:convert'; import 'package:shared_preferences/shared_preferences.dart'; class JSpUtil ... 
- 一文带你了解华为云GaussDB的五大黑科技
			摘要:在华为开发者大会2021(HDC·Cloud)中,华为云数据库多位技术专家分享了GaussDB系列数据库全新5大黑科技. 4月24-26日,华为开发者大会2021(HDC·Cloud)在深圳隆重 ... 
