您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: