题目: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的更多相关文章

  1. 51 nod 1055 最长等差数列(dp)

    1055 最长等差数列 基准时间限制:2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题 N个不同的正整数,找出由这些数组成的最长的等差数列.     例如:1 3 5 6 8 9 ...

  2. 51 nod 1610 路径计数(Moblus+dp)

    1610 路径计数 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   路径上所有边权的最大公约数定义为一条路径的值. 给定一个有向无环图.T次修改操作,每次修改一 ...

  3. codevs 1962 马棚问题--序列型DP

    1962 马棚问题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 每天,小明和他的马外出,然后他们一边跑一边玩耍.当他们结束 ...

  4. 括号序列的dp问题模型

    括号序列的dp问题模型 Codeforces314E ◦给定一个长度为n的仅包含左括号和问号的字符串,将问号变成左括号或 右括号使得该括号序列合法,求方案总数. ◦例如(())与()()都是合法的括号 ...

  5. [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT)

    [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT) 题面 小C有一个集合S,里面的元素都是小于质数M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数 ...

  6. 5.13 省选模拟赛 优雅的绽放吧,墨染樱花 多项式 prufer序列 计数 dp

    LINK:优雅的绽放吧,墨染樱花 当时考完只会50分的做法 最近做了某道题受到启发 故会做这道题目了.(末尾附30分 50分 100分code 看到度数容易想到prufer序列 考虑dp统计方案数. ...

  7. At grand 022 GCD序列构造 dp/floyd二进制变换最少费用

    A diverse words指的是每一个字母在单词中出现的次数不超过1的单词 题目要求你求出字典序比当前给定单词大的字典序最小单词 1.如果给定的单词长度小于26 就遍历一次在单词尾部加上字典序最小 ...

  8. 51 nod 1495 中国好区间

    1495 中国好区间 基准时间限制:0.7 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   阿尔法在玩一个游戏,阿尔法给出了一个长度为n的序列,他认为,一段好的区间,它的长度是& ...

  9. 51 nod 1427 文明 (并查集 + 树的直径)

    1427 文明 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 难度:6级算法题   安德鲁在玩一个叫“文明”的游戏.大妈正在帮助他. 这个游 ...

随机推荐

  1. emacs 简记

    简介 Emacs作为神的编辑器,不用介绍了吧,说点感受. 用了一段时间了,总体感觉其实Emacs是很简单的,甚至比vim还简单,因为在X环境下,打开后可以就像记事本一样使用.但是,使用Emacs的人一 ...

  2. RPMBUILD源码打包资源汇总(转)

    http://mattshma.github.io/2015/11/04/rpm%E6%89%93%E5%8C%85/ http://400053.blog.51cto.com/390053/7210 ...

  3. C#泛型<T>说明

    泛型:即通过参数化类型来实现在同一份代码上操作多种数据类型.泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用. C#泛型的作用概述 C#泛型赋予了代码更强的类型安全,更 ...

  4. SQL ROW_NUMBER() 分页使用示例

    ALTER PROC [dbo].[TestProPage] , AS BEGIN SELECT * FROM (SELECT *,ROW_NUMBER() OVER(ORDER BY IndexID ...

  5. DNS--域名系统 随笔

    定义:是一种用于TCP/IP应用程序的分布式数据库.(分布式数据库:指利用高速计算机网络将物理上分散的多个数据存储单元连接起来组成一个逻辑上统一的数据库.分布式数据库的基本思想是将原来集中式数据库中的 ...

  6. MANIFEST.MF 文件内容完全详解(转)

    打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录, 这个目录下会有一些文件,其中必有一个MANIFEST.MF,这个文件描述了该Jar文件的很多信息,下面将详细介绍MANI ...

  7. 在pycharm中误删了Python文件,怎么办,挺急的?

    1.今天在操作的时候,误删了文件,怎么办? (1)找到删除的上一级文件=>右键,找到Local History=>Show History (2),打开之后,双击左边的恢复时间内容,在右边 ...

  8. 【24题】P2766最长不下降子序列问题

    网络流二十四题 网络流是个好东西,希望我也会. 网络流?\(orz\ zsy!!!!!\) P2766 最长不下降子序列问题 考虑我们是如何\(dp\)这个\(LIS\)的. 我们是倒着推,设置\(d ...

  9. Linux安装mariadb详细步骤

    1.安装mariadb yum和源码编译安装的区别? 1.路径区别-yum安装的软件是他自定义的,源码安装的软件./configure --preifx=软件安装的绝对路径 2.yum仓库的软件,版本 ...

  10. 我的Java开发学习之旅------>Java NIO 报java.nio.charset.MalformedInputException: Input length = 1异常

    今天在使用Java NIO的Channel和Buffer进行文件操作时候,报了java.nio.charset.MalformedInputException: Input length = 1异常, ...