最长路及其字典序输出所有解
2014-05-15 21:00
162 查看
#include<stdio.h>
#include<string.h>
int a[110],b[110];
int g[110][110];
int d[110];
int ans[110];
int n;
int cnt;
int tot;
void print_ans(int i,int maxs){
int j,k;
ans[cnt++] = i;
if(cnt>=maxs){
printf("Case %d:",tot++);
for(k = 0;k<cnt;k++) printf("%d ",ans[k]);
printf("\n");
}
for(j = 1;j<=n;j++){
if(g[i][j] && d[i] == d[j]+1){
print_ans(j,maxs);
cnt--;
}
}
}
int DP(int i){
int j;
int &ans = d[i];
if(ans>0) return ans;
ans = 1;
for(j = 1;j<=n;j++){
if(g[i][j]) {
int temp = DP(j)+1;
if(ans<temp) ans = temp;
}
}
return ans;
}
int main(){
int i,j;
int maxs,index;
while(scanf("%d",&n)!=EOF){
for(i = 1;i<=n;i++){
scanf("%d%d",&a[i],&b[i]);
}
memset(g,0,sizeof(g));
memset(d,-1,sizeof(d));
for(i = 1;i<=n;i++){
for(j = 1;j<=n;j++){
if((a[i]<b[j]&&b[i]<a[j])||(a[i]<a[j] && b[i]<b[j])) g[i][j] = 1;
}
}
for(i = 1;i<=n;i++){
for(j = 1;j<=n;j++) printf("%d ",g[i][j]);
printf("\n");
}
index = 1;
maxs = 1;
for(i = 1;i<=n;i++){
int temp = DP(i);
if(maxs<temp){
maxs = temp;
index = i;
}
}
printf("%d\n",maxs);
cnt = 0;
tot = 1;
print_ans(index,maxs);
}
return 0;
}
#include<string.h>
int a[110],b[110];
int g[110][110];
int d[110];
int ans[110];
int n;
int cnt;
int tot;
void print_ans(int i,int maxs){
int j,k;
ans[cnt++] = i;
if(cnt>=maxs){
printf("Case %d:",tot++);
for(k = 0;k<cnt;k++) printf("%d ",ans[k]);
printf("\n");
}
for(j = 1;j<=n;j++){
if(g[i][j] && d[i] == d[j]+1){
print_ans(j,maxs);
cnt--;
}
}
}
int DP(int i){
int j;
int &ans = d[i];
if(ans>0) return ans;
ans = 1;
for(j = 1;j<=n;j++){
if(g[i][j]) {
int temp = DP(j)+1;
if(ans<temp) ans = temp;
}
}
return ans;
}
int main(){
int i,j;
int maxs,index;
while(scanf("%d",&n)!=EOF){
for(i = 1;i<=n;i++){
scanf("%d%d",&a[i],&b[i]);
}
memset(g,0,sizeof(g));
memset(d,-1,sizeof(d));
for(i = 1;i<=n;i++){
for(j = 1;j<=n;j++){
if((a[i]<b[j]&&b[i]<a[j])||(a[i]<a[j] && b[i]<b[j])) g[i][j] = 1;
}
}
for(i = 1;i<=n;i++){
for(j = 1;j<=n;j++) printf("%d ",g[i][j]);
printf("\n");
}
index = 1;
maxs = 1;
for(i = 1;i<=n;i++){
int temp = DP(i);
if(maxs<temp){
maxs = temp;
index = i;
}
}
printf("%d\n",maxs);
cnt = 0;
tot = 1;
print_ans(index,maxs);
}
return 0;
}
相关文章推荐
- UVA 103 Stacking Boxes(DAG 上的最长路及其字典序输出)
- php遍历目录输出目录及其下的所有文件示例
- 面试题 0到N的所有数按字典序输出
- 输出当前目录及其所有子目录名称
- UVA103动态规划之DAG上的最长路及其字典序
- 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。
- C习题:输出2-1000的所有完数及其真因子
- 输出字符串的所有全排列(递归法和非递归,非递归采用组合数学的字典序)
- 怎样输出二叉树的所有路径(按字典序)?
- 输出广义表中所有原子项及其所在层次的递归算法
- php遍历目录输出目录及其下的所有图片文件
- php遍历目录输出目录及其下的所有文件示例
- DAG之硬币问题DP(最长路及其字典序)
- ZOJ1083:Frame Stacking(拓扑排序 & 字典序输出所有结果)
- 按字典序输出这串字母出现最多的字母和第二多的字母(先把所有字母次数多少排好序)
- php遍历目录输出目录及其下的所有文件
- c语言:获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。
- 用JAVA扫描指定文件夹下面所有以.txt结尾的文件,并将其绝对路径输出 .
- 输出n对括号的所有有效(左右括号成对匹配)排列
- 第11周 项目6-5 输出1000以内的所有回文数