51 nod 1522 上下序列——序列dp
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1522
很好的思想。考虑从小到大一对一对填数,这样也能对它的大小限制做一些操作了。
因为从小到大,所以只能全填在左边、全填在右边、两边各填一个。记录左边填到了哪个位置,就可知右边填到了哪个位置。转移之前判断一下这样填是否合法即可。
新的不合法的状态只会和现在填的两个位置有关。
注意输入格式!!符号前后有空格!!!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=,M=;
int n,m,x[M],y[M],sgn[M],tx,ty;
ll dp[N][N<<],ans;
char ch[];
bool check(int p0,int p1,int r,int fx)
{
//printf("p0=%d p1=%d r=%d fx=%d\n",p0,p1,r,fx);
for(int i=;i<=m;i++)
if(sgn[i]==&&
( ( (x[i]==p0||x[i]==p1)&&y[i]!=p0&&y[i]!=p1)||
( (y[i]==p0||y[i]==p1)&&x[i]!=p0&&x[i]!=p1) ) )
return ;//以前都合法,不合法仅出现在p0、p1位置上
if(!fx)
{
for(int i=;i<=m;i++)
{
//printf("sgn[%d]=%d\n",i,sgn[i]);
if(sgn[i]==||sgn[i]==)
{
tx=x[i];ty=y[i];
if(sgn[i]==)swap(tx,ty);
//printf("tx=%d ty=%d p0=%d p1=%d r=%d\n",tx,ty,p0,p1,r);
if((ty==p0||ty==p1)&&tx>=p0&&tx<r) return ;
}
if(sgn[i]==||sgn[i]==)
{
tx=x[i];ty=y[i];
if(sgn[i]==)swap(tx,ty);
if((ty==p0||ty==p1)&&tx>p1&&tx<r) return ;
}
}
}
if(fx==)
{
for(int i=;i<=m;i++)
{
if(sgn[i]==||sgn[i]==)
{
tx=x[i];ty=y[i];
if(sgn[i]==)swap(tx,ty);
if((ty==p0||ty==p1)&&tx<=p1&&tx>r) return ;
}
if(sgn[i]==||sgn[i]==)
{
tx=x[i];ty=y[i];
if(sgn[i]==)swap(tx,ty);
if((ty==p0||ty==p1)&&tx<p0&&tx>r) return ;
}
}
}
if(fx==)
{
for(int i=;i<=m;i++)
{
if(sgn[i]==||sgn[i]==)
{
tx=x[i];ty=y[i];
if(sgn[i]==)swap(tx,ty);
if((ty==p0||ty==p1)&&tx>=p0&&tx<=p1) return ;
}
if(sgn[i]==||sgn[i]==)
{
tx=x[i];ty=y[i];
if(sgn[i]==)swap(tx,ty);
if((ty==p0||ty==p1)&&tx>p0&&tx<p1) return ;
}
}
}
return ;
}
int main()
{
scanf("%d%d",&n,&m);ch[]=getchar();
while(ch[]!='\n')ch[]=getchar();
for(int i=,len=,j;i<=m;i++,len=)
{
ch[++len]=getchar();
while(ch[len]!='\n')ch[++len]=getchar();
for(j=;j<len;j++)
{
if(ch[j]>=''&&ch[j]<='')
x[i]=(x[i]<<)+(x[i]<<)+ch[j]-'';
else break;
}
while(ch[j]==' ')j++;
//printf("j=%d chj=(%c)\n",j,ch[j]);
if(ch[j]=='=') sgn[i]=,j++;
else if(ch[j]=='<'&&ch[j+]=='=')sgn[i]=,j+=;
else if(ch[j]=='>'&&ch[j+]=='=')sgn[i]=,j+=;
else if(ch[j]=='<')sgn[i]=,j++;
else if(ch[j]=='>')sgn[i]=,j++;
while(ch[j]==' ')j++;
//printf("j=%d chj=(%c)\n",j,ch[j]);
for(;j<len;j++)
y[i]=(y[i]<<)+(y[i]<<)+ch[j]-'';
//printf("x=%d sgn=%d y=%d\n",x[i],sgn[i],y[i]);
}
dp[][]=;
for(int i=,lm;i<n;i++)
{
lm=(i<<);
for(int j=,r;j<=lm;j++)
{
//if(dp[i][j])printf("dp[%d][%d]=%lld\n",i,j,dp[i][j]);
r=(n<<)-(lm-j)+;
if(check(j+,j+,r,))
dp[i+][j+]+=dp[i][j];
//printf("dp[%d][%d]=%lld(%d,%d)\n",i+1,j+2,dp[i+1][j+2],i,j);
if(check(r-,r-,j,))
dp[i+][j]+=dp[i][j];
//printf("dp[%d][%d]=%lld(%d,%d)\n",i+1,j,dp[i+1][j],i,j);
if(check(j+,r-,,))
dp[i+][j+]+=dp[i][j];
//printf("dp[%d][%d]=%lld(%d,%d)\n",i+1,j+1,dp[i+1][j+1],i,j);
}
}
int lm=(n<<);
for(int j=;j<=lm;j++) ans+=dp[n][j];
printf("%lld\n",ans/);
return ;
}
51 nod 1522 上下序列——序列dp的更多相关文章
- 51 nod 1055 最长等差数列(dp)
1055 最长等差数列 基准时间限制:2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题 N个不同的正整数,找出由这些数组成的最长的等差数列. 例如:1 3 5 6 8 9 ...
- 51 nod 1610 路径计数(Moblus+dp)
1610 路径计数 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 路径上所有边权的最大公约数定义为一条路径的值. 给定一个有向无环图.T次修改操作,每次修改一 ...
- codevs 1962 马棚问题--序列型DP
1962 马棚问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 每天,小明和他的马外出,然后他们一边跑一边玩耍.当他们结束 ...
- 括号序列的dp问题模型
括号序列的dp问题模型 Codeforces314E ◦给定一个长度为n的仅包含左括号和问号的字符串,将问号变成左括号或 右括号使得该括号序列合法,求方案总数. ◦例如(())与()()都是合法的括号 ...
- [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT)
[BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT) 题面 小C有一个集合S,里面的元素都是小于质数M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数 ...
- 5.13 省选模拟赛 优雅的绽放吧,墨染樱花 多项式 prufer序列 计数 dp
LINK:优雅的绽放吧,墨染樱花 当时考完只会50分的做法 最近做了某道题受到启发 故会做这道题目了.(末尾附30分 50分 100分code 看到度数容易想到prufer序列 考虑dp统计方案数. ...
- At grand 022 GCD序列构造 dp/floyd二进制变换最少费用
A diverse words指的是每一个字母在单词中出现的次数不超过1的单词 题目要求你求出字典序比当前给定单词大的字典序最小单词 1.如果给定的单词长度小于26 就遍历一次在单词尾部加上字典序最小 ...
- 51 nod 1495 中国好区间
1495 中国好区间 基准时间限制:0.7 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 阿尔法在玩一个游戏,阿尔法给出了一个长度为n的序列,他认为,一段好的区间,它的长度是& ...
- 51 nod 1427 文明 (并查集 + 树的直径)
1427 文明 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 安德鲁在玩一个叫“文明”的游戏.大妈正在帮助他. 这个游 ...
随机推荐
- 每门课由平时成绩和考试成绩组成,满分为r。现在他知道每门课的平时成绩为ai ,若想让这门课的考试成绩多拿一分的话,小v要花bi 的时间复习,不复习的话当然就是0分。同时我们显然可以发现复习得再多也不会拿到超过满分的分数。为了拿到奖学金,小v至少要花多少时间复习。
遇到问题要常思考为什么,做这道题的时候,要注意给定的数据范围. 第一行三个整数n,r,avg(n大于等于1小于等于1e5,r大于等于1小于等于1e9,avg大于等于1小于等于1e6),接下来n行,每行 ...
- 史上最浅显易懂的Git教程2 github
Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上.怎么分布呢?最早,肯定只有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都是一样的, ...
- CSDN专訪:大数据时代下的商业存储
原文地址:http://www.csdn.net/article/2014-06-03/2820044-cloud-emc-hadoop 摘要:EMC公司作为全球信息存储及管理产品方面的率先公司,不久 ...
- Objective-C中NSString转NSNumber的方法
本文转载至 http://www.linuxidc.com/Linux/2013-02/78866.htm 在Objective-C中,以数字格式组成的字符串经常需要转换为NSNumber对象后再使用 ...
- 两个DataGridEHToExcel
procedure TForm1.N1Click(Sender: TObject); var GridtoExcel: TDBGridEhToExcel; begin try Gri ...
- 兔子的晚会 2016Vijos省选集训 day1
兔子的晚会 (xor.c/pas/cpp)============================= 很久很久之前,兔子王国里居住着一群兔子.每到新年,兔子国王和他的守卫总是去现场参加晚会来欢庆新年. ...
- rtmp直播拉流客户端EasyRTMPClient TCP窗口大小设计方法
EasyRTMPClient 简介 EasyRTMPClient是EasyDarwin流媒体团队开发.提供的一套非常稳定.易用.支持重连接的RTMPClient工具,以SDK形式提供,接口调用非常简单 ...
- JAVA解析XML之DOM方式
JAVA解析XML之DOM方式 准备工作 创建DocumentBuilderFactory对象; 创建DocumentBuilder对象; 通过DocumentBuilder对象的parse方法 ...
- 硬分叉后,BCH的钱包解决方案
上周BCH进行了硬分叉,分叉成了两条链:BCH和BCHSV,对于分叉后的BCH如何进行交易呢?钱包是否有相关的危险因素? 由于分叉后的两条链没做重放保护,可能导致一条链上发起的交易,在另一条链上做重放 ...
- 获取系统 SID
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/hadstj/article/details/26399533 获取系统 SID ((gwmi win ...