Codeforces 567F
2015-08-09 21:47
211 查看
题目
CF567F题意
给n个数字,每个数字使用两次,最终构成一个递增和一个递减序列(递增或者递减序列可以不存在),给定k个限定条件,求构造的个数。思路
从外向里填,dp[i][j][k]表示填区间[i,j]用数字k来填充。【注意mx=70而不是35,摔
代码
#include <cstdio> #include <cstring> #include <iostream> #include <vector> using namespace std; #define ll long long const int mx = 75; ll dp[mx][mx][mx]; vector<pair<int,int> > q[mx]; bool jud(int l1,int r1,int l,int r){ int a,b; for(int i=0;i<q[l1].size();i++){ a=q[l1][i].first; b=q[l1][i].second; if(b==3&&a!=r1&&a!=l1)return false; if(b==4&&a<r&&a>l&&a!=r1&&a!=l1)return false; if(b==5&&a<r&&a>l)return false; } for(int i=0;i<q[r1].size();i++){ a=q[r1][i].first; b=q[r1][i].second; if(b==3&&a!=l1&&a!=r1)return false; if(b==4&&a<r&&a>l&&a!=l1&&a!=r1)return false; if(b==5&&a<r&&a>l)return false; } return true; } ll dfs(int l,int r,int num){ if(l+1==r){ return 1; } if(dp[l][r][num]>=0) return dp[l][r][num]; ll ans=0L; if(jud(l+1,l+2,l,r))ans+=dfs(l+2,r,num+1); if((l+2)!=(r-1)&&jud(l+1,r-1,l,r))ans+=dfs(l+1,r-1,num+1); if((l+2)!=(r-1)&&jud(r-1,r-2,l,r))ans+=dfs(l,r-2,num+1); return dp[l][r][num]=ans; } int main(){ // freopen("t.in","r",stdin); // freopen("t.out","w",stdout); int n,k,x,y,tmp; string str; memset(dp,-1,sizeof(dp)); scanf("%d%d",&n,&k); while(k--){ cin>>x>>str>>y; if(str=="<")tmp=1; if(str=="<=")tmp=2; if(str=="=")tmp=3; if(str==">=")tmp=4; if(str==">")tmp=5; if(tmp>=3) q[x].push_back(make_pair(y,tmp)); else q[y].push_back(make_pair(x,6-tmp)); } printf("%I64d\n",dfs(0,n*2+1,0)); return 0; }
相关文章推荐
- 计蒜客 难题题库 014 罗马数字转换成整数
- [POJ 3169] Layout 差分约束
- 黑马程序员-----java基础之运算符----与(&)、或(|)、非(!)、异或(^)、短路与(&&)等
- HDOJ1071
- 借贷宝注册提现详细攻略:注册送20元,邀请好友再各送20元,亲测可无条件提现(附提现、到账截图)
- UISearchBar去除背景颜色
- #每日Linux小练习#06 Shell Script知识点总结(上)
- EL表达式简单应用
- Singleton---单例模式(创建型)
- 信息发布
- Codeforces 5C
- android Installation failed due to invalid URI! 错误处理
- 计蒜客 难题题库 013 整数转换成罗马数字
- Right me speak (对我自己说
- 周工作总结及计划表
- IOS--UIImageView--帧动画
- 计蒜客 难题题库 012 最后一个单词的长度
- PHP的文件格式应该以UTF-8无BOM编码
- 通过windows中间层过滤驱动修改接收数据包的内容
- 对自己的了解