您的位置:首页 > 其它

DAG上的动态规划两题

2017-12-01 13:29 141 查看
NYOJ16

嵌套矩形 其实就是刘汝佳紫书中的题目。而且不要求字典序输出。开始想着按照自己的思路写的,后来发现都错了,因为它的起点是不固定的,开始想当然以为起点固定。

思路:把输入的每个矩形当做是图的节点,然后将满足条件的二者建边,(如a能嵌套在b里面,则a与b之前建立一条由a到b的边)。然后动态规划求图的最大距离。

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1e3+50;
int n,t,d[maxn],l,c,edge[maxn][maxn],maxs;

struct node{
int l,c;
};
node no[maxn];

void udn(){
for(int i=0;i<n;i++){
scanf("%d %d",&l,&c);
no[i].l=l;
no[i].c=c;
}
//int arcnum=n*(n-1)*0.5;
memset(edge,inf,sizeof(edge));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if((no[i].l<no[j].l&&no[i].c<no[j].c)||(no[i].c<no[j].l&&no[i].l<no[j].c))
edge[i][j]=1;
}

int dp(int i){
int &ans=d[i];
if(ans>0)
return ans;
ans=1;
for(int j=0;j<n;j++)
if(edge[i][j]==1)
ans=max(dp(i),dp(j)+1);
return ans;
}

int main(){
while(scanf("%d",&t)!=EOF){
for(int i=0;i<t;i++){
scanf("%d",&n);
udn();
maxs=0;
memset(d,0,sizeof(d));
for(int j=0;j<n;j++)
maxs=max(dp(j),maxs);
printf("%d\n",maxs);
}
}
return 0;
}
uva437
道理和上体一样,不同的是每个长方体都有三个面需要考虑,所以每个长方体对应需要建立3个节点。然后思路和上题一样。

开始在自习室做的时候不知道为什么一直得不出答案,今天在图书馆没怎么改就出来了。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=100;
int t,x,y,z,edge[maxn][maxn],maxs,d[maxn],casenum=0,N;
struct node{
int x,y,h;
};
node n[maxn];

void createedge(){
memset(edge,inf,sizeof(edge));
for(int i=0;i<3*t;i++)///i--->j(j>i)
for(int j=0;j<3*t;j++)
if((n[i].x<n[j].x&&n[i].y<n[j].y)||(n[i].x<n[j].y&&n[i].y<n[j].x))
{edge[i][j]=n[i].h;}
}

int dp(int i){
int &ans=d[i];
if(ans>0)
return ans;
ans=n[i].h;
for(int j=0;j<3*t;j++)
if(edge[i][j]!=inf){
ans=max(ans,dp(j)+edge[i][j]);
}
return ans;
}

int main(){
while(scanf("%d",&t)!=EOF){
if(t==0)
break;
casenum++;
for(int i=0;i<3*t;i++){
scanf("%d %d %d",&x,&y,&z);
n[i].x=x;
n[i].y=y;//0
n[i].h=z;

n[++i].x=x;//1
n[i].y=z;
n[i].h=y;

n[++i].x=y;//2
n[i].y=z;
n[i].h=x;
}
createedge();
maxs=0;
memset(d,0,sizeof(d));
for(int i=0;i<3*t;i++){

4000
maxs=max(maxs,dp(i));
}
printf("Case %d: maximum height = %d\n",casenum,maxs);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: