题目: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[105][3];
ll f[40][80][80];
char ch[5];
bool ck(int a,int b,int fl)
{if(fl==1){for(int i=1,x,y;i<=m;i++){x=c[i][1]; y=c[i][2];if((x==a&&y==b)||(x==b&&y==a)&&c[i][0]!=1)return 0;if((x==a||x==b)&&y>b&&(c[i][0]!=4&&c[i][0]!=2))return 0;if((y==a||y==b)&&x>b&&(c[i][0]!=5&&c[i][0]!=3))return 0;}return 1;}if(fl==0){for(int i=1,x,y;i<=m;i++){x=c[i][1]; y=c[i][2];if((x==a&&y==b)||(x==b&&y==a)&&c[i][0]!=1)return 0;if((x==a||x==b)&&y<a&&(c[i][0]!=4&&c[i][0]!=2))return 0;if((y==a||y==b)&&x<a&&(c[i][0]!=5&&c[i][0]!=3))return 0;}return 1;}if(fl==2){for(int i=1,x,y;i<=m;i++){x=c[i][1]; y=c[i][2];if((x==a&&y==b)||(x==b&&y==a)&&c[i][0]!=1)return 0;if((x==a||x==b)&&(y>a&&y<b)&&(c[i][0]!=4&&c[i][0]!=2))return 0;if((y==a||y==b)&&(x>a&&x<b)&&(c[i][0]!=5&&c[i][0]!=3))return 0;}return 1;}if(fl==4){for(int i=1,x=c[i][1],y=c[i][2];i<=m;i++,x=c[i][1],y=c[i][2])if((x==a&&y==b)||(x==b&&y==a)&&(c[i][0]==2||c[i][0]==3))return 0;return 1;}
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){scanf("%d %s %d",&c[i][1],&ch,&c[i][2]);if(ch[0]=='=')c[i][0]=1;else if(ch[0]=='<'&&ch[1]=='=')c[i][0]=4;else if(ch[0]=='>'&&ch[1]=='=')c[i][0]=5;else if(ch[0]=='<')c[i][0]=2;else if(ch[0]=='>')c[i][0]=3;}for(int i=1;i<2*n;i++)if(ck(i,i+1,4))f[n][i][i+1]=1;for(int i=n-1;i;i--)for(int l=1;l<=2*n;l++)for(int r=l+1;r<=2*n;r++)if(f[i+1][l][r]){
//                    printf("i=%d l=%d r=%d\n",i,l,r);int x,y;if(l>2){x=l-2,y=l-1;if(ck(x,y,1))f[i][x][r]+=f[i+1][l][r];
//                                         printf("f[%d][%d][%d]=%d\n",i,x,r,f[i][x][r]);
                    }if(r+2<=2*n){x=r+1,y=r+2;if(ck(x,y,0))f[i][l][y]+=f[i+1][l][r];
//                                         printf("f[%d][%d][%d]=%d\n",i,l,y,f[i][l][y]);
                    }if(l>1&&r+1<=2*n){x=l-1; y=r+1;if(ck(x,y,2))f[i][x][y]+=f[i+1][l][r];
//                                         printf("f[%d][%d][%d]=%d\n",i,x,y,f[i][x][y]);
                       }}printf("%lld\n",f[1][1][n<<1]);return 0;
}

于是参考了一下TJ...

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

代码如下:

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

转载于:https://www.cnblogs.com/Zinn/p/9672540.html

51Nod 1522 上下序列 —— 区间DP相关推荐

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

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

  2. 51nod 1522 上下序列

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

  3. 题目2 : 回文字符序列(区间DP)

    时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定字符串,求它的回文子序列个数.回文子序列反转字符顺序后仍然与原序列相同.例如字符串aba中,回文子序列为"a& ...

  4. 51Nod - 1522 区间dp

    题意: 题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1522 思路: 很好的区间dp. 从1开始填起,两个1 ...

  5. UVA1626 括号序列 Brackets sequence(区间DP匹配括号,输出匹配方案)

    整理的算法模板合集: ACM模板 UVA1626 Brackets sequence 我们将正规括号序列定义如下: 空序列是正规括号序列. 如果 SSS 是一个正规括号序列,那么 (S) 和 [S] ...

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

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

  7. BZOJ4350: 括号序列再战猪猪侠(区间DP)

    传送门 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个合法的括号序列. 2.若A是合法的括号序列,则(A)是合法 ...

  8. BZOJ4350: 括号序列再战猪猪侠【区间DP】

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

  9. POJ 2955 Brackets (区间DP)

    题目链接:http://poj.org/problem?id=2955 Brackets Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

最新文章

  1. Azure Neural TTS能让AI语音自然逼真到什么程度?
  2. MySQL查询中LIMIT的大offset导致性能低下浅析
  3. javascript-操作符
  4. 2022年终结版WPF项目实战合集发布
  5. java jcsh执行linux命令,java jcsh执行linux命令
  6. Mysql学习总结(80)——统计数据库的总记录数和库中各个表的数据量
  7. hdu4747 线段树区间修改值,区间查询和及最大值即最大值位置
  8. java二级考纲_二级JAVA程序设计考试大纲
  9. Linux内核4.17再获捷报
  10. C程序设计--指针(用 “ 函数 ” 对 “ 多维数组 ” 进行操作)
  11. 【PRML 学习笔记】第二章 - 概率分布 (Probability Distributions)
  12. NameNode DataNode
  13. 【ARM 】CMSIS
  14. GIS招聘 | 辽宁省省直事业单位(含测绘、地信等专业岗位)
  15. 英特尔酷睿处理器后缀
  16. Microsoft Edge浏览器黑色背景修改
  17. destoon php文件,destoon代码从头到尾捋一遍
  18. 【深度解局】佛慢你:张小龙的微信成功三字诀
  19. 如何购买云服务器及其配置
  20. 微生物多样性数据分析(16S)

热门文章

  1. oracle 表单重命名,Oracle重命名表
  2. 利用PE系统破解密码
  3. Android路由框架ARouter原理
  4. 有什么音质好的入门级蓝牙耳机?盘点音质好的蓝牙耳机推荐
  5. jquery 抽离公共页面
  6. MathType破解版中特殊符号如何输入
  7. “华为杯”研究生数学建模竞赛2020年-【华为杯】C题:脑电信号分析与判别模型研究(附获奖论文和python代码实现)
  8. 我发现曾经你真正去深入弄过的东西,你很长时间没碰,再去回看之前笔记也能很快捡起来。
  9. macbook pro音质测试软件,Soomal作品 - Apple 苹果 Macbook Pro 13 Retina[2019]音质测评报告 [Soomal]...
  10. vue如何设置在标签上监听一个事件并触发