uva 103
2017-05-16 21:26
225 查看
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
int a[30 + 5][30 +5];
struct node{
int o;
int po;
}dis[30 + 5];
bool vis[30 + 5][30 + 5];
int n,k;
bool isOk(int x[],int y[]){
for(int i = 0; i < k; i++)
if(x[i] >= y[i])
return false;
return true;
}
bool cmp(node a, node b){
return a.o < b.o;
}
int dfs(int x){
int ans;
int Max = 0;
for(int i = 0; i < n; i++){
if(vis[x][i]){
if(dis[i].o)
ans = 1 + dis[i].o;
else
ans = 1 + dfs(i);
if(ans > Max)
Max = ans;
}
}
return Max;
}
int main(){
while(~scanf("%d%d",&n,&k)){
memset(vis,0,sizeof vis);
memset(dis,0,sizeof dis);
for(int i = 0; i < n; i++)
for(int j = 0; j < k; j++)
scanf("%d",&a[i][j]);
for(int i = 0; i < n; i++)
sort(a[i],a[i]+k);
for(int i = 0; i < n; i++)
for(int j = i+1; j < n; j++)
if(isOk(a[i],a[j]))
vis[i][j] = 1;
else if(isOk(a[j],a[i]))
vis[j][i] = 1;
int Max = 0;
int pos = 0;
for(int i = 0; i < n; i++){
dis[i].o = dfs(i);
dis[i].po = i;
if(dis[i].o > Max){
Max = dis[i].o;
pos = i;
}
}
printf("%d\n",Max+1);
sort(dis,dis+n,cmp);
printf("%d ",pos+1);
int temp = Max-1;
int femp = pos;
for(int i = n-1; i >= 0 && Max >= -1; i--){
if(vis[femp][dis[i].po] && dis[i].o == temp){
printf("%d ",dis[i].po+1);
temp--;
femp = dis[i].po;
}
}
printf("\n");
}
return 0;
}
卡时间注意记忆化搜索,输出也不能太恶心,还可以递归
#include <string>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
int a[30 + 5][30 +5];
struct node{
int o;
int po;
}dis[30 + 5];
bool vis[30 + 5][30 + 5];
int n,k;
bool isOk(int x[],int y[]){
for(int i = 0; i < k; i++)
if(x[i] >= y[i])
return false;
return true;
}
bool cmp(node a, node b){
return a.o < b.o;
}
int dfs(int x){
int ans;
int Max = 0;
for(int i = 0; i < n; i++){
if(vis[x][i]){
if(dis[i].o)
ans = 1 + dis[i].o;
else
ans = 1 + dfs(i);
if(ans > Max)
Max = ans;
}
}
return Max;
}
int main(){
while(~scanf("%d%d",&n,&k)){
memset(vis,0,sizeof vis);
memset(dis,0,sizeof dis);
for(int i = 0; i < n; i++)
for(int j = 0; j < k; j++)
scanf("%d",&a[i][j]);
for(int i = 0; i < n; i++)
sort(a[i],a[i]+k);
for(int i = 0; i < n; i++)
for(int j = i+1; j < n; j++)
if(isOk(a[i],a[j]))
vis[i][j] = 1;
else if(isOk(a[j],a[i]))
vis[j][i] = 1;
int Max = 0;
int pos = 0;
for(int i = 0; i < n; i++){
dis[i].o = dfs(i);
dis[i].po = i;
if(dis[i].o > Max){
Max = dis[i].o;
pos = i;
}
}
printf("%d\n",Max+1);
sort(dis,dis+n,cmp);
printf("%d ",pos+1);
int temp = Max-1;
int femp = pos;
for(int i = n-1; i >= 0 && Max >= -1; i--){
if(vis[femp][dis[i].po] && dis[i].o == temp){
printf("%d ",dis[i].po+1);
temp--;
femp = dis[i].po;
}
}
printf("\n");
}
return 0;
}
卡时间注意记忆化搜索,输出也不能太恶心,还可以递归
相关文章推荐
- UVA 103 - Stacking Boxes
- Uva - 103 - Stacking Boxes
- [UVA 103] Stacking Boxes
- Uva 103 Stacking Boxes
- uva 103 Stacking Boxes(DAG上的最长路径)
- UVa 103 - Stacking Boxes
- UVa - 103 - Stacking Boxes
- ACM UVa 算法题100, 101, 103, 104, 112, 10405解法
- UVA 103 - Stacking Boxes
- UVA - 103 Stacking Boxes
- UVA 103
- UVA103 转化相对位置+最长上升子序列
- UVa 103 Stacking Boxes / 记忆化搜索
- UVA103 (DP)
- UVA 103 Stacking Boxes (dp + DAG上的最长路径 + 记忆化搜索)
- uva 103/UVA 10405 [lcs]
- UVA 103 Stacking Boxes(最长增长子序列变形)
- UVa 103 Stacking Boxes 堆砌盒子(DP 最长条件子序列)
- uva 103 Stacking Boxes
- UVa 103 - Stacking Boxes