[区间记忆化dp入门][Bribe the Prisoners SPOJ - GCJ1C09C][Codeforces Round #505D (rated, Div. 1 + Div. 2, ba]
Bribe the Prisoners SPOJ - GCJ1C09C
作为这类题代表,f[i][j]代表第i点到第j点单独处理的最值
这题关键:释放某个囚犯后,就把囚犯分成两段,两段互相独立
这类dp问题的突破口在于一个点能把问题分成两段,两段互相独立,这两段的限制条件只与l-1,r+1有关,记忆化搜索,时间复杂度o(n*n*n)
#include<bits/stdc++.h>
using namespace std;
long long n,t,T,min1,m,a[100000],f[1000][1000];
long long dfs(int l,int r){ // cout<<l<<' '<<r<<endl;if (r<l) return 0;if (f[l][r]) return f[l][r];long long p=1e15;for (int i=l;i<=r;i++)p=min(p,(a[r+1]-a[l-1]-2)+dfs(l,i-1)+dfs(i+1,r));// cout<<l<<' '<<r<<' '<<p<<endl;f[l][r]=p; return p; }
int main()
{ cin>>T;while (T--){ t++;memset(f,0,sizeof(f));cin>>n>>m;min1=1e15;a[m+1]=0; a[m+2]=n+1;for (int i=1;i<=m;i++) cin>>a[i];m=m+2;sort(a+1,a+1+m);for (int i=2;i<=m-1;i++)min1=min(min1,(n-1)+dfs(2,i-1)+dfs(i+1,m-1));cout<<"Case #"<<t<<": "; cout<<min1<<endl; }
}
[Codeforces Round #505D (rated, Div. 1 + Div. 2, ba]
其实是一道很简单的区间dp记忆化搜索,太久没写这种类型的了。
定义二叉排序树
二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
显然会想到排序, 预处理两点之间是否有>1的gcd
考虑任何一个点作为根节点,只要两边分别满足条件即可,(同时两边有一个树与根节点不互质,这个只要在找子区间根节点是特判就行)(两边互相独立不影响)
节点两边分别为一段连续区间(且这段区间的根节点一定是r+1或者l-1)
f[i][j][0/1]代表i-j区间是否可能作为根节点的左子树/右子树
#include<bits/stdc++.h>
using namespace std;
int n,t,a[1000],g[1000][1000],f[1000][1000][2],v[1000][1000][2];
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0' || ch>'9') {if(ch=='-') f=-1;ch=getchar();}while(ch>='0' && ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;
}
inline int gcd(int a,int b) {return b?gcd(b,a%b):a;}
int calc(int l,int r,int c)
{if (c==0) return r+1; else return l-1;}
int dfs(int l,int r,int c)
{ if (l>r) return 1;if (v[l][r][c]) return f[l][r][c];
//注意因为f[l][r][c]可能处理过后值为0;所以用v[i][j][r]判断是否处理过(调好久原因)v[l][r][c]=1;int p=0;for (int i=l;i<=r;i++)if (g[i][calc(l,r,c)] && dfs(l,i-1,0) && dfs(i+1,r,1)){p=1; break;} f[l][r][c]=p; return p;
}
int main()
{ n=read();for (int i=1;i<=n;i++) a[i]=read();sort(a+1,a+1+n);for (int i=1;i<=n;i++)for (int j=1;j<=n;j++)if (gcd(a[i],a[j])>1) g[i][j]=1; else g[i][j]=0;for (int i=1;i<=n;i++)if (dfs(1,i-1,0) && dfs(i+1,n,1)) {t=1;break;}if (t==1) cout<<"Yes"<<endl;else cout<<"No"<<endl;
}
[区间记忆化dp入门][Bribe the Prisoners SPOJ - GCJ1C09C][Codeforces Round #505D (rated, Div. 1 + Div. 2, ba]相关推荐
- Bribe the Prisoners SPOJ - GCJ1C09C
滴答滴答---题目链接 贿赂囚犯 Bribe the prisoners ( 动态规划+剪枝) Problem In a kingdom there are prison cells (numbere ...
- FatMouse and Cheese HDU - 1078(记忆化搜索入门模板)
题意: n * n的正方形格子(每个格子均放了奶酪),老鼠从(0,0)开始,每次最多移动k步,可以选择上下左右四个方向移动,下一个移动点奶酪块数量必须要大于当前点. 整理模板ing- 题目: FatM ...
- Educational Codeforces Round 111 (Rated for Div. 2) E. Stringforces 二分 + 状压dp
传送门 文章目录 题意: 思路: 题意: 给你一个串,只包含前kkk个字母和???,定义fif_ifi表示第iii个字母在串中出现的最长连续长度,你现在需要将???替换为前kkk个字母,使得mini ...
- Educational Codeforces Round 73 (Rated for Div. 2) Make The Fence Great Again dp + 结论
传送门 文章目录 题意: 思路: 题意: 思路: 首先证明一个结论:一个数最多被加两次. 首先假设a[i]=a[i−1]a[i]=a[i-1]a[i]=a[i−1]或a[i]=a[i+1]a[i]=a ...
- Codeforces Round #459 (Div. 2) C 思维,贪心 D 记忆化dp
Codeforces Round #459 (Div. 2) C. The Monster 题意:定义正确的括号串,是能够全部匹配的左右括号串. 给出一个字符串,有 (.). ? 三种字符, ? 可以 ...
- I. Space Station(hash记忆化+dp)
<文章>陆游 文章本天成,妙手偶得之. 粹然无疵瑕,岂复须人为. 君看古彝器,巧拙两无施. 汉最近先秦,固已殊淳漓. 胡部何为者,豪竹杂哀丝. 后夔不复作,千载谁与期? I. Space ...
- 【线性 dp】A005_LC_不同的子序列(记忆化 / dp 分类讨论)
一.Problem 给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数. 题目数据保证答案符合 32 位带符号整数范围. 示例 1: 输入:S = "rabbbit ...
- 【01 dp】A005_LC_生成数组(暴搜 / 记忆化 / dp)
一.Problem Given three integers n, m and k. Consider the following algorithm to find the maximum elem ...
- HDU1937How many ways(记忆化搜索)入门
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission ...
最新文章
- SSH配置优化和慢的解决方法
- day4 流程控制while 判断if
- JAVA try...catch...finally中的执行顺序和return语句
- 论文解读:深度监督网络(Deeply-Supervised Nets)
- shiro+springboot分析思路
- 对话阿里云李飞飞:下一代企业级数据库6大技术方向
- linux unset path,linux查看和修改PATH环境变量的方法
- 网络路径无法访问问题的解决
- Java:switch语句例子
- mac tomcat java_Mac下配置Java开发环境(JDK1.8)和Tomcat服务器
- Scrapy安装介绍
- Powerbi实现帕累托分析
- easyui 控制某列显示不显示_baogaiMCU控制OLED显示屏
- 剑指offer 面试题59 - II. 队列的最大值
- 使用DataWorks调度DLA循环任务
- ECSHOP模板设置只有登录用户才能查看商品详情内容
- 搭建MySQL可视化Web界面服务器
- windows快速创建文本文档的几个方法快捷键和
- jmeter接口测试详细教程
- 堆栈stack的基本操作