寒假最后一题补完啦 ^∀^

题意

1到n每个数字有两个,排成先不降后不升的序列,比如112332,并且满足k个形如 3 <= 6 代表第三个数字要≤第六个数字这样的约束要求,求有多少种排法。

分析

区间DP,dp[i][j]表示只有区间[i,j]还没填时的方案数。

b[i][j]表示第i和j位置的数字约束关系。

然后从两头开始排,每次把两个数字t放在两边或者同一边。

dp[i+1][j-1]+=dp[i][j];//放在两边

dp[i+2][j]+=dp[i][j];//放在左边

dp[i][j-2]+=dp[i][j];//放在右边

并且要满足约束条件。如果i位置小于j位置,那么必须先放i位置。

即放在当前位置上的数>(≥)已经放好的位置上的数,<(≤)未放置的位置上的数。

并且每次放的两个位置如果有约束关系,只能是含有=的(=、≥、≤)。

当j==i+1时,就只能一种放法了,这时候就可以累加答案了。

当我们放数字t时,区间[i,j]的长度是2*n-2*(t-1),所以j=i+2*n-2*(t-1)-1=2*n-2*t+i+1。

方案数比较大,所以要用long long。

代码

#include<cstdio>
#include<cstring>
#define ll long long
#define N 75
int n,k;
ll dp[N][N],ans;
int b[N][N];
//b[i][j] -2 -1 3 1 2
//i s j > >= = <= <
int ch(int fl,int fr,int a,int c)//现在排的位置上的数要比自由部分的小
{
for(int i=fl; i<=fr; i++)
if(b[a][i]==||b[c][i]==||b[a][i]<||b[c][i]<)return ;
return ;
}
int cc(int bl,int br,int a,int c){//现在排的位置上的数要比排好部分的大
for(int i=;i<=bl;i++)
if(b[a][i]>||b[c][i]>)return ;
for(int i=br;i<=*n;i++)
if(b[a][i]>||b[c][i]>)return ;
return ;
}
int check(int i,int j)//不可以放在两个数字不允许相同的位置上
{
return b[i][j]!=-&&b[i][j]!=;
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=; i<=k; i++)
{
int l,r,f=;
char s[];
scanf("%d%s%d",&l,s,&r);
if(s[]=='<')
{
f=;
if(s[])f--;
}
else if(s[]=='>')
{
f=-;
if(s[])f++;
}
b[l][r]=f;
b[r][l]=f==?f:-f;
}
dp[][*n]=;
for(int t=; t<=n; t++)
for(int i=; i<=*t-; i++)
{
int j=*n-*t+i+;
if(dp[i][j])
{
if(j==i+)
{
if(check(i,j))
ans+=dp[i][j];
}
else
{
if(ch(i+,j-,i,j)&&cc(i-,j+,i,j)&&check(i,j))
dp[i+][j-]+=dp[i][j];
if(ch(i+,j,i,i+)&&cc(i-,j+,i,i+)&&check(i,i+))
dp[i+][j]+=dp[i][j];
if(ch(i,j-,j-,j)&&cc(i-,j+,j-,j)&&check(j-,j))
dp[i][j-]+=dp[i][j];
}
}
}
printf("%lld",ans);
return ;
}

  

【CodeForces 567F】Mausoleum的更多相关文章

  1. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  2. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

  3. 【codeforces 707C】Pythagorean Triples

    [题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...

  4. 【codeforces 709D】Recover the String

    [题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...

  5. 【codeforces 709B】Checkpoints

    [题目链接]:http://codeforces.com/contest/709/problem/B [题意] 让你从起点开始走过n-1个点(至少n-1个) 问你最少走多远; [题解] 肯定不多走啊; ...

  6. 【codeforces 709C】Letters Cyclic Shift

    [题目链接]:http://codeforces.com/contest/709/problem/C [题意] 让你改变一个字符串的子集(连续的一段); ->这一段的每个字符的字母都变成之前的一 ...

  7. 【Codeforces 429D】 Tricky Function

    [题目链接] http://codeforces.com/problemset/problem/429/D [算法] 令Si = A1 + A2 + ... + Ai(A的前缀和) 则g(i,j) = ...

  8. 【Codeforces 670C】 Cinema

    [题目链接] http://codeforces.com/contest/670/problem/C [算法] 离散化 [代码] #include<bits/stdc++.h> using ...

  9. 【codeforces 515D】Drazil and Tiles

    [题目链接]:http://codeforces.com/contest/515/problem/D [题意] 给你一个n*m的格子; 然后让你用1*2的长方形去填格子的空缺; 如果有填满的方案且方案 ...

随机推荐

  1. unix基本命令日记

    鉴于命令经常忘记,网站文章鱼龙混杂,很多不适合自己,现在记录方便自己查看.每个人的基础不同,需要合适的文章也不一样. 用户管理 useradd 功能说明:建立用户帐号. 语 法:useradd [-m ...

  2. JMeter学习(十四)JMeter监控Tomcat性能

    使用jmeter的tomcat监视器功能,可以通过向tomcat的status页面发送get请求,得到资源使用信息,然后转换为只直观的图像方式,这样的话,就可以监视到服务器的资源使用情况,不过需要注意 ...

  3. c#解决窗体假死的一种方法

    public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_C ...

  4. onresize方法

    resize()方法可以写在当前页面包含的所有js里

  5. readLine读取socket流的时候产生了阻塞

    BufferedReader的readLine方法,只要读到流结束或者流关闭,就会返回null 在读取文件的时候,文件结尾就是流的结尾,但对于Socket而言不是的.不能认为流中数据读完了就是流的结尾 ...

  6. 超详细图解:自己架设NuGet服务器

    原文:http://diaosbook.com/Post/2012/12/15/setup-private-nuget-server NuGet 是.NET程序员熟知的给.NET项目自动配置安装lib ...

  7. Java中的IO流系统详解(转载)

    摘要: Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java ...

  8. Ruby Web实时消息后台服务器推送技术---GoEasy

    越来越多的项目需要用到实时消息的推送与接收,怎样用Ruby实现最方便呢?我这里推荐大家使用GoEasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送! 浏览器兼容性:GoEasy推 ...

  9. 转载:有关SQL server connection Keep Alive 的FAQ(3)

    转载:http://blogs.msdn.com/b/apgcdsd/archive/2012/06/07/sql-server-connection-keep-alive-faq-3.aspx 这个 ...

  10. C# 单点登录 MVC

    实现sso系统的主要难点: 1:不能直接访问数据库,有安全隐患,而且还容易乱套. 2:多个系统需要进行单点登录,逻辑需要严谨,能支持N多系统.而不只是少数几个系统. 3:代码不能过于复杂,需要简洁,灵 ...