hdu 5693 && LightOj 1422 区间DP
hdu 5693
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5693
等差数列当划分细了后只用比较2个或者3个数就可以了,因为大于3的数都可以由2和3组合成。
区间DP,用dp[i][j]表示在i到j之间可以删除的最大数,枚举区间长度,再考虑区间两端是否满足等差数列(这是考虑两个数的),再i到j之间枚举k,分别判断左端点右端点和k是否构成等差数列(还是考虑两个数的),判断左端点,k,右端点是否构成等差数列(这是考虑三个数的)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; const int M = + ; bool vis[M][M];
int dp[M][M],n,m,a[M];
int max(int x,int y){return x>y?x:y;} void solvedp()
{
for (int len= ; len<=n ; len++){
for (int l= ; l<=n ; l++){
int r=l+len;
if (r>n) break;
if (vis[l][r]&&dp[l+][r-]==r-l-)
dp[l][r]=max(dp[l][r],dp[l+][r-]+);
for (int i=l ; i<=r ; i++)
dp[l][r]=max(dp[l][r],dp[l][i]+dp[i+][r]);
for (int i=l+ ; i<r ; i++){
if (vis[l][i]&&dp[l+][i-]==i-l+)
dp[l][r]=max(dp[l][r],dp[l+][i-]+dp[i+][r]+);
if (vis[i][r]&&dp[i+][r-]==r-i-)
dp[l][r]=max(dp[l][r],dp[l][i-]+dp[i+][r-]+);
if (vis[l][i]&&vis[i][r]&&dp[l+][i-]==i-l-&&dp[i+][r-]==r-i-
&&a[r]-a[i]==a[i]-a[l])
dp[l][r]=max(dp[l][r],r-l+);
}
}
}
} int main()
{
int t;
scanf("%d",&t);
while (t--){
memset(vis,false,sizeof(vis));
memset(dp,,sizeof(dp));
scanf("%d%d",&n,&m);
for (int i= ; i<=n ; i++) scanf("%d",&a[i]);
for (int i= ; i<=m ; i++) {
int x;
scanf("%d",&x);
for (int i= ; i<=n ; i++)
for (int j=i+ ; j<=n ; j++)
if (a[j]-a[i]==x)
vis[i][j]=true;
}
solvedp();
printf("%d\n",dp[][n]);
} return ;
}
lightoj 1422
有n个party,姑娘参加每个party都必须穿规定好的种类的衣服,可以将多件不同种类的衣服都套在身上,只要最外面的一层衣服满足party的规定就行了,但是一旦脱下的衣服就不能再次穿上,问最少需要多少件衣服。
比如第二组样例 1 2 1 1 3 2 1 先穿上种类1的衣服参加晚会1 ,不脱然后继续穿上种类2的衣服参加晚会2,再脱下种类2衣服参加晚会3,4,然后再穿上种类3衣服参加晚会5,再脱下它穿上种类2衣服参加晚会6,在脱下它,此时身上只剩种类1衣服,刚好参加最后一个晚会,所以需要种类1 2 3 2 四件衣服。
乍一看就是当遇见之前没有遇见过的种类的衣服的时候,答案肯定要加一,当遇到了之前见过的种类的衣服,此时就要考虑是否穿上这件衣服也就是答案是否要加一,此时就一个用到二维区间dp,dp[i][j]表示在区间i到j之间需要的最少的衣服数,当穿 j 这件衣服的时候,dp[i][j]=dp[i][j-1]+1,不穿的时候那肯定是之前也遇见过这个种类的衣服还穿在身上,那么就在i到j之间枚举k,当a[k]==a[j]的时候此时的dp[i][j]=min(dp[i][j],dp[i][k],dp[k+1][j])
dp无非就是状态的转移,这里的就是穿不穿这件衣服这个状态,找出这两个选择后的状态发展。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; int min(int x,int y) {return x<y?x:y;}
const int M = + ;
int dp[M][M],a[M]; int main()
{
int t,ans=,n;
scanf("%d",&t);
while (t--){
scanf("%d",&n);
for (int i= ; i<=n ; i++) scanf("%d",&a[i]);
for(int i=;i<=n;i++)
for(int j=i;j<=n;j++)
dp[i][j]=j-i+;
for (int i=n- ; i>= ; i--){
for (int j=i+ ; j<=n ; j++){
dp[i][j]=min(dp[i][j],dp[i][j-]+);
for (int k=i ; k<j ; k++){
if (a[j]==a[k])
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+][j-]);
}
}
}
printf("Case %d: %d\n",++ans,dp[][n]);
}
return ;
}
hdu 5693 && LightOj 1422 区间DP的更多相关文章
- HDU 5693 D Game 区间dp
		
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5693 题解: 一种朴实的想法是枚举选择可以删除的两个或三个数(其他的大于三的数都能凑成2和3的和), ...
 - LightOJ 1422 (区间DP)
		
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27130 题目大意:按顺序去参加舞会.每个舞会对衣服都有要求.可以 ...
 - LightOJ 1422 区间DP Halloween Costumes
		
d(i, j)表示第i天到第j天至少要穿多少件衣服. 先不考虑第i天和后面 i+1 ~ j 天的联系,那就是至少要穿 1 + d(i+1, j)件衣服. 再看状态转移,如果后面第k(i+1 ≤ k ≤ ...
 - HDU 2476 String painter(区间DP+思维)
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2476 题目大意:给你字符串A.B,每次操作可以将一段区间刷成任意字符,问最少需要几次操作可以使得字符串 ...
 - HDU 5115 Dire Wolf 区间dp
		
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5115 Dire Wolf Time Limit: 5000/5000 MS (Java/Others ...
 - hdu 4597 Play Game 区间dp
		
Play Game Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=459 ...
 - hdu 4745 Two Rabbits   区间DP
		
http://acm.hdu.edu.cn/showproblem.php?pid=4745 题意: 有两只兔子Tom Jerry, 他们在一个用石头围城的环形的路上跳, Tom只能顺时针跳,Jerr ...
 - hdu 5181 numbers——思路+区间DP
		
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5181 题解:https://www.cnblogs.com/Miracevin/p/10960717.ht ...
 - HDU  1141---Brackets Sequence(区间DP)
		
题目链接 http://poj.org/problem?id=1141 Description Let us define a regular brackets sequence in the fol ...
 
随机推荐
- 通过日志恢复SQL Server的历史数据
			
通过日志恢复SQL Server的历史数据 Posted on 2008-11-14 21:47 代码乱了 阅读(4658) 评论(10) 编辑 收藏 园子里前段时间发过一篇通过日志恢复MSSQL数 ...
 - Android Monkey: “No activities found to run, monkey aborted”错误原因
			
用monkey测试app时,输入命令adb shell monkey -p com.example.test -v -500 发现报错, 错误输入: :Monkey: seed=13 count=5 ...
 - java容器的理解(collection)
			
容器类(Conllection)对于一个开发者来说是最强大的工具之一,可以大幅提高编程能力.容器是一个将多个元素组合到一个单元的对象,是代表一组对象的对象,容器中的对象成为它的元素. 容器适用于处理各 ...
 - 学JS的心路历程-闭包closure
			
闭包是是纯函式语言的一个特性,也是JS的一个关键性的特色,虽然不了解也能开发程序,但我们不是这种人对吧? 闭包不仅可以减少某些高阶功能的代码数量和复杂度,并且可以让我们做到原本无法做的复杂功能.听到这 ...
 - Cascade Classifier Training  没有基础也会目标检测啦
			
Cascade Classifier Training 具体自己看: http://docs.opencv.org/2.4.13.2/doc/user_guide/ug_traincascade.ht ...
 - Linux安装face_recgnition
			
Ubuntu 3:apt-get install python3.6-dev 4:pip3 install face_recgnition 5: pip3 install opencv-python ...
 - SVM参数解析
			
一.Opencv中的核函数定义(4种): 1.CvSVM::LINEAR : 线性内核,没有任何向映射至高维空间,线性区分(或回归)在原始特点空间中被完成,这是最快的选择. 2.CvSVM::POLY ...
 - 05_ssm基础(一)之mybatis简单使用
			
01.mybatis使用引导与准备 1.ssm框架 指: sping+springMVC+mybatis 2.学习mybatis前准备web标准项目结构 model中的Ticket代码如下: pack ...
 - JMeter学习(十一)WebSerivice测试计划(转载)
			
转载自 http://www.cnblogs.com/yangxia-test WebSerivice测试计划的取样器有两种方式:HTTP请求.SOAP/XML-RPC Request. 1. 测试计 ...
 - 【C++】正则表达式引擎学习心得
			
最近参照一些资料实现了一个非常简易的正则表达式引擎,支持基本的正则语法 | + * ()等. 实现思路是最基本的:正则式->AST->NFA->DFA. 以下是具体步骤: 一. 正则 ...