博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【CodeForces 567F】Mausoleum
阅读量:6119 次
发布时间:2019-06-21

本文共 1983 字,大约阅读时间需要 6 分钟。

寒假最后一补完啦 ^∀^

题意

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
#include
#define ll long long#define N 75int n,k;ll dp[N][N],ans;int b[N][N];//b[i][j] -2 -1 3 1 2//i s j > >= = <=
0||b[c][i]>0)return 0; for(int i=br;i<=2*n;i++) if(b[a][i]>0||b[c][i]>0)return 0; return 1;}int check(int i,int j)//不可以放在两个数字不允许相同的位置上{ return b[i][j]!=-2&&b[i][j]!=2;}int main(){ scanf("%d%d",&n,&k); for(int i=1; i<=k; i++) { int l,r,f=3; char s[5]; scanf("%d%s%d",&l,s,&r); if(s[0]=='<') { f=2; if(s[1])f--; } else if(s[0]=='>') { f=-2; if(s[1])f++; } b[l][r]=f; b[r][l]=f==3?f:-f; } dp[1][2*n]=1; for(int t=1; t<=n; t++) for(int i=1; i<=2*t-1; i++) { int j=2*n-2*t+i+1; if(dp[i][j]) { if(j==i+1) { if(check(i,j)) ans+=dp[i][j]; } else { if(ch(i+1,j-1,i,j)&&cc(i-1,j+1,i,j)&&check(i,j)) dp[i+1][j-1]+=dp[i][j]; if(ch(i+2,j,i,i+1)&&cc(i-1,j+1,i,i+1)&&check(i,i+1)) dp[i+2][j]+=dp[i][j]; if(ch(i,j-2,j-1,j)&&cc(i-1,j+1,j-1,j)&&check(j-1,j)) dp[i][j-2]+=dp[i][j]; } } } printf("%lld",ans); return 0;}

 

 

 

  

 

转载地址:http://pnmka.baihongyu.com/

你可能感兴趣的文章
coco2d-x 基于视口的地图设计
查看>>
C++文件读写详解(ofstream,ifstream,fstream)
查看>>
Android打包常见错误之Export aborted because fatal lint errors were found
查看>>
Tar打包、压缩与解压缩到指定目录的方法
查看>>
新手如何学习 jQuery?
查看>>
配置spring上下文
查看>>
Python异步IO --- 轻松管理10k+并发连接
查看>>
mysql-python模块编译问题解决
查看>>
Oracle中drop user和drop user cascade的区别
查看>>
【Linux】linux经常使用基本命令
查看>>
Java 内存区域和GC机制
查看>>
更新代码和工具,组织起来,提供所有博文(C++,2014.09)
查看>>
HTML模块化:使用HTML5 Boilerplate模板
查看>>
登记申请汇总
查看>>
Google最新截屏案例详解
查看>>
2015第31周一
查看>>
2015第31周日
查看>>
在使用EF开发时候,遇到 using 语句中使用的类型必须可隐式转换为“System.IDisposable“ 这个问题。...
查看>>
Oracle 如何提交手册Cluster Table事务
查看>>
BeagleBone Black第八课板:建立Eclipse编程环境
查看>>