题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1522

区间DP,从大往小加;

新加入一种数有3种加法:全加左边,全加右边,一左一右;

然后判断一下加完是否满足那些条件即可;

但判断这个条件还挺复杂,一不小心就写丑了错了...

冗余错误写法:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int n,m,c[][];
ll f[][][];
char ch[];
bool ck(int a,int b,int fl)
{
if(fl==)
{
for(int i=,x,y;i<=m;i++)
{
x=c[i][]; y=c[i][];
if((x==a&&y==b)||(x==b&&y==a)&&c[i][]!=)return ;
if((x==a||x==b)&&y>b&&(c[i][]!=&&c[i][]!=))return ;
if((y==a||y==b)&&x>b&&(c[i][]!=&&c[i][]!=))return ;
}
return ;
}
if(fl==)
{
for(int i=,x,y;i<=m;i++)
{
x=c[i][]; y=c[i][];
if((x==a&&y==b)||(x==b&&y==a)&&c[i][]!=)return ;
if((x==a||x==b)&&y<a&&(c[i][]!=&&c[i][]!=))return ;
if((y==a||y==b)&&x<a&&(c[i][]!=&&c[i][]!=))return ;
}
return ;
}
if(fl==)
{
for(int i=,x,y;i<=m;i++)
{
x=c[i][]; y=c[i][];
if((x==a&&y==b)||(x==b&&y==a)&&c[i][]!=)return ;
if((x==a||x==b)&&(y>a&&y<b)&&(c[i][]!=&&c[i][]!=))return ;
if((y==a||y==b)&&(x>a&&x<b)&&(c[i][]!=&&c[i][]!=))return ;
}
return ;
}
if(fl==)
{
for(int i=,x=c[i][],y=c[i][];i<=m;i++,x=c[i][],y=c[i][])
if((x==a&&y==b)||(x==b&&y==a)&&(c[i][]==||c[i][]==))return ;
return ;
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d %s %d",&c[i][],&ch,&c[i][]);
if(ch[]=='=')c[i][]=;
else if(ch[]=='<'&&ch[]=='=')c[i][]=;
else if(ch[]=='>'&&ch[]=='=')c[i][]=;
else if(ch[]=='<')c[i][]=;
else if(ch[]=='>')c[i][]=;
}
for(int i=;i<*n;i++)if(ck(i,i+,))f[n][i][i+]=;
for(int i=n-;i;i--)
for(int l=;l<=*n;l++)
for(int r=l+;r<=*n;r++)
if(f[i+][l][r])
{
// printf("i=%d l=%d r=%d\n",i,l,r);
int x,y;
if(l>)
{
x=l-,y=l-;
if(ck(x,y,))f[i][x][r]+=f[i+][l][r];
// printf("f[%d][%d][%d]=%d\n",i,x,r,f[i][x][r]);
}
if(r+<=*n)
{
x=r+,y=r+;
if(ck(x,y,))f[i][l][y]+=f[i+][l][r];
// printf("f[%d][%d][%d]=%d\n",i,l,y,f[i][l][y]);
}
if(l>&&r+<=*n)
{
x=l-; y=r+;
if(ck(x,y,))f[i][x][y]+=f[i+][l][r];
// printf("f[%d][%d][%d]=%d\n",i,x,y,f[i][x][y]);
}
}
printf("%lld\n",f[][][n<<]);
return ;
}

于是参考了一下TJ...

调了一小时只因把 x==b 写成 y==b ?!而且还一直没仔细看...

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int n,m,c[][];
ll f[][];
char ch[];
bool ck0(int a,int b)
{
for(int i=,x=c[i][],y=c[i][];i<=m;i++,x=c[i][],y=c[i][])
if(((x==a&&y==b)||(x==b&&y==a))&&(c[i][]==||c[i][]==))return ;
return ;
}
bool ck(int l,int r,int a,int b)
{
for(int i=;i<=m;i++)
{
int x=c[i][],y=c[i][],cc=c[i][];
bool ix=(x==a||x==b),iy=(y==a||y==b);
bool kx=(x>=l&&x<=r),ky=(y>=l&&y<=r);
if(cc==&&((ix!=iy)||(kx!=ky)))return ;//=
if(cc==&&(!ky&&(ix||kx)))return ;//<
if(cc==&&(!kx&&(iy||ky)))return ;//>
if(cc==&&((ix&&!iy&&!ky)||(kx&&!ky)))return ;//<=
if(cc==&&((iy&&!ix&&!kx)||(ky&&!kx)))return ;//>=
}
return ;
}
int main()
{
scanf("%d%d",&n,&m);
bool flag=; int cnt=;
for(int i=,x,y,cc;i<=m;i++)
{
scanf("%d %s %d",&x,&ch,&y);
if(ch[]=='=')cc=;
else if(ch[]=='<'&&ch[]=='=')cc=;
else if(ch[]=='>'&&ch[]=='=')cc=;
else if(ch[]=='<')cc=;
else if(ch[]=='>')cc=;
if(x==y)
{
if(cc==||cc==)flag=;
continue;//!
}
c[++cnt][]=x; c[cnt][]=y; c[cnt][]=cc;
}
if(flag){printf("0\n"); return ;}
m=cnt;
for(int i=;i<*n;i++)if(ck0(i,i+))f[i][i+]=;
for(int l=;l<=*n;l+=)
for(int i=;i<=*n-l+;i++)
{
int j=i+l-;
if(ck(i+,j,i,i+))f[i][j]+=f[i+][j];
if(ck(i,j-,j-,j))f[i][j]+=f[i][j-];
if(ck(i+,j-,i,j))f[i][j]+=f[i+][j-];
}
printf("%lld\n",f[][*n]);
return ;
}

51Nod 1522 上下序列 —— 区间DP的更多相关文章

  1. $51nod\ 1522$ 上下序列 $dp$

    正解:$dp$ 解题报告: 传送门$QwQ$ 一年过去了$gql$还是不咋会这题,,,好菜昂我的$NOIp$必将惨败了$kk$ 考虑从大到小枚举两个相同的数填哪儿,根据那个限制,十分显然的是这两个数必 ...

  2. 51nod 1522 上下序列

    题目描述 现在有1到n的整数,每一种有两个.要求把他们排在一排,排成一个2*n长度的序列,排列的要求是从左到右看,先是不降,然后是不升. 特别的,也可以只由不降序列,或者不升序列构成. 例如,下面这些 ...

  3. 编程之美2015资格赛 题目2 : 回文字符序列 [ 区间dp ]

    传送门 题目2 : 回文字符序列 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定字符串,求它的回文子序列个数.回文子序列反转字符顺序后仍然与原序列相同.例如字符串ab ...

  4. 51nod 1021 石子归并 - 区间dp(经典)

    题目地址:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1021 经典区间dp,dp[i][j] 表示将从 i 到 j 堆 ...

  5. TZOJ 3295 括号序列(区间DP)

    描述 给定一串字符串,只由 “[”.“]” .“(”.“)”四个字符构成.现在让你尽量少的添加括号,得到一个规则的序列. 例如:“()”.“[]”.“(())”.“([])”.“()[]”.“()[( ...

  6. 51nod 1021 石子归并 区间DP

    1021 石子归并  基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  取消关注 N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆 ...

  7. 51Nod 1021 石子归并(区间dp经典入门)

    题意: N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价.计算将N堆石子合并成一堆的最小代价. n<=100 思 ...

  8. 【区间DP】codevs3657 括号序列题解

    题目描述 Description 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合法的,那么AB ...

  9. [BZOJ 4350]括号序列再战猪猪侠 题解(区间DP)

    [BZOJ 4350]括号序列再战猪猪侠 Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个 ...

随机推荐

  1. Oracle 实现查询不区分大小写(设置数据库)

    转http://blog.csdn.net/shl7765856/article/details/7622756 查询数据的时候. SQL Server 默认 不区分大小写. 如果要区分,就要额外的设 ...

  2. hdu 1179最大匹配

    #include<stdio.h> #include<string.h> #define N 200 int map[N][N],visit[N],link[N],n,m; i ...

  3. Django开发:(1)django基础 & url控制器

    HTTP请求协议 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(WWW:World Wide Web )服务器与本地浏览器之间传输超文本 ...

  4. js格式化日期时间

    // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).周(E).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1 ...

  5. Apache 使用localhost(127.0.0.1)可以访问,使用本机IP(局域网)不能访问

    本机ip是:192.168.1.25,输入后提示: Forbidden You don't have permission to access / on this server 对于此问题的解决办法, ...

  6. 06-js的逻辑结构

    <html> <head> <title>js的逻辑结构和循环结构学习</title> <meta charset="UTF-8&quo ...

  7. JAVA配置--JDK环境变量配置

    环境变量是整台电脑的全局变量,(这台电脑上)任何程序都可以读取这个变量. 如果您安装好jdk,但环境变量配置让你感到有一点模糊的话,那么请您看一下这篇,希望对您有帮助 根据打开电脑的属性(R),出现 ...

  8. Spring集成Jedis(不依赖spring-data-redis)(单机/集群模式)(待实践)

    Jedis是Redis的Java客户端,Spring将Jedis连接池作为一个Bean来配置.如果在Spring Data的官网上可以发现,Spring Data Redis已经将Jedis集成进去了 ...

  9. Servlet的Cookies处理

    以下内容引用自http://wiki.jikexueyuan.com/project/servlet/cookies-handling.html: Cookies是存储在客户端计算机上的文本文件,用于 ...

  10. Java利用jacob实现文档格式转换

    实现文档格式之间的转换,我使用的是jacob-1.7版本,需要jacob.jar来调用activex控件,本机需安装WPS/office,还需要jacob.jar以及jacob.dll 其中:    ...