| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
离散化,记忆化搜索过#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define CL(a,b) memset(a,b,sizeof(a))
#define MAX(a,b) (a>b?a:b)
using namespace std;
const int N(200);
struct data{
int x,y,z;
}a[N<<3];
bool epual (data one,data two)
{
if(one.x!=two.x||one.y!=two.y||one.z!=two.z)
return true;
return false;
}
int arr[N<<3];
void change(int i,int &j)
{
a[j].z=a[i].x;a[j].x=a[i].y;a[j++].y=a[i].z;
a[j].z=a[i].x;a[j].x=a[i].z;a[j++].y=a[i].y;
a[j].z=a[i].y;a[j].x=a[i].x;a[j++].y=a[i].z;
a[j].z=a[i].y;a[j].x=a[i].z;a[j++].y=a[i].x;
a[j].z=a[i].z;a[j].x=a[i].y;a[j++].y=a[i].x;
}
int fkey(int val,int l,int r)
{
int mid;
while(l<=r)
{
mid=(l+r)>>1;
if(arr[mid]==val)
return mid;
else if(val<arr[mid])
r=mid-1;
else
l=mid+1;
}
return -1;
}
bool cmp(data one,data two)
{
return one.x<two.x||(one.x==two.x&&one.y<two.y)||(one.x==two.x&&one.y==two.y&&one.z<two.z);
}
int dp[N][N];
bool vis[N<<3];
void dfs(int t,int px,int py)
{
int i;
for(i=0;i<t;i++)
if(!vis[i]&&dp[px][py]+a[i].z>dp[a[i].x][a[i].y]&&(px>a[i].x&&py>a[i].y))
{
vis[i]=true;
dp[a[i].x][a[i].y]=dp[px][py]+a[i].z;
dfs(t,a[i].x,a[i].y);
vis[i]=false;
}
return;
}
int main()
{
int n,i,m,j,k,cas=1;
while(scanf("%d",&n)&&n)
{
for(i=0,j=0;i<n;i++)
{
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
arr[j++]=a[i].x;
arr[j++]=a[i].y;
arr[j++]=a[i].z;
}
sort(arr,arr+j);
m=1;
for(i=1;i<j;i++)
if(arr[i]!=arr[i-1]) arr[m++]=arr[i];
//for(i=0;i<m;i++)
// printf("%d ",arr[i]);
j=n;
for(i=0;i<n;i++)
change(i,j);
sort(a,a+j,cmp);
int t=1;
for(i=1;i<j;i++)
if(epual(a[i],a[i-1]))
a[t++]=a[i];
for(i=0;i<t;i++)
{
a[i].x=fkey(a[i].x,0,m-1);
a[i].y=fkey(a[i].y,0,m-1);
}
//for(i=0;i<t;i++)
// printf("%d %d %d\n",a[i].x,a[i].y,a[i].z);
CL(dp,0);
dfs(t,m,m);
int sum=0;
for(i=0;i<m;i++)
for(j=0;j<m;j++)
sum=MAX(sum,dp[i][j]);
printf("Case %d: maximum height = %d\n",cas++,sum);
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator