【【henuacm2016级暑期训练】动态规划专题 I】Gargari and Permutations
2024-09-07 19:45:21
【链接】 我是链接,点我呀:)
【题意】
在这里输入题意
【题解】
注意这k个序列每个都是排列。
如果在每个序列中都满足y出现在x之后的话。
那么我们从x连一条有向边至y
(有一个序列不满足就不连
(这就表明最后的序列中x可以紧接着y
最后显然会形成一个有向无环图。
在这个图上求最长链就好了。
可以在做拓扑排序的时候边做这个dp.
【代码】
#include <bits/stdc++.h>
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define all(x) x.begin(),x.end()
#define pb push_back
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;
const double pi = acos(-1);
const int dx[4] = {0,0,1,-1};
const int dy[4] = {1,-1,0,0};
const int N = 1000;
int n,k,a[N+10],ru[N+10],f[N+10];
bool bo[N+10][N+10];
queue<int> dl;
int main(){
#ifdef LOCAL_DEFINE
freopen("rush_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(0),cin.tie(0);
cin >> n >> k;
memset(bo,true,sizeof bo);
for (int i = 1;i <= n;i++) ru[i] = n-1;
for (int i = 1;i <= k;i++){
for (int i = 1;i <= n;i++) cin >> a[i];
for (int i = 1;i <= n;i++){
for (int j = 1;j <= i-1;j++){
if (bo[a[i]][a[j]]==true) {
ru[a[j]]--;
}
bo[a[i]][a[j]] = false;
}
}
}
for (int i = 1;i <= n;i++)
if (ru[i]==0){
dl.push(i);
f[i] = 1;
ru[i]=-1;
}
while (!dl.empty()){
int x = dl.front();dl.pop();
for (int i = 1;i <= n;i++)
if (i!=x && bo[x][i]){
ru[i]--;
f[i] = max(f[i],f[x]+1);
if (ru[i]==0){
ru[i] = -1;
dl.push(i);
}
}
}
int ans = 0;
for (int i = 1;i <= n;i++) ans = max(ans,f[i]);
cout<<ans<<endl;
return 0;
}
最新文章
- [Nginx笔记]关于线上环境CLOSE_WAIT和TIME_WAIT过高
- TODO:MongoDB MySQL数据库备份
- 记录对依赖注入的小小理解和autofac的简单封装
- phpnow修改默认站点根目录的方法
- PHP中IP地址与整型数字互相转换详解
- centos7 使用 omnibus包安装方式,安装 gitlab7.4
- 【转】SQL SERVER 开窗函数简介
- ArcGIS For JavaScript API 默认参数
- 【Opencv 小工具】鼠标选区信息获取
- log4net 动态设定日志文件名
- QT多线程笔记
- 从ulimit命令看socket的限制
- LFM 隐语义模型
- C语言运算符表(优先级)
- Hadoop化繁为简-从安装Linux到搭建集群环境
- C:\Program Files\Java\jdk1.7.0_79\bin\java.exe&#39;&#39; finished with non-zero exit value 1
- 记录下在阿里云linux上安装与配置Mysql
- 在linux上添加硬盘
- ORM的相关操作
- mapreduce深入剖析5大视频