您的位置:首页 > 其它

经典DP 嵌套矩形 (南洋理工ACM—16)

2014-08-28 11:37 232 查看
本来是个很水的DP,结果被自己的代码习惯给打败了

代码:

#include<iostream>
#include<stdlib.h>
#include<string.h>

using namespace std;

typedef struct rectangle
{
int x;
int y;
}Rectangle;

Rectangle a[1002];
int map[1002][1002];
int d[1002];
int N;

int dp(int t)
{
int &ans = d[t];
if(ans>=0)
return ans;
int max=0;
for(int i=0; i<N;i++)
{
if(map[t][i]==1)
{
if(max<dp(i))
max = dp(i);
}
}
return d[t] = max+1;
}

int main()
{
int T;
cin>>T;
while(T--)
{
memset(d,-1,sizeof(d));
cin>>N;
for(int i=0; i<N;i++)
{
cin>>a[i].x>>a[i].y;
}
//构图
memset(map,0,sizeof(map));
for(int i=0; i<N; i++)
{
for(int j=0; j<N; j++)
{
if((a[i].x>a[j].x&&a[i].y>a[j].y)||(a[i].y>a[j].x&&a[i].x>a[j].y))
map[i][j]=1;
}
}
int max=0;
for(int i=0; i<N; i++)
{
if(dp(i)>max)
max = dp(i);
}
cout<<max<<endl;
}
return 0;
}


d[]用来实现记忆化搜索,记忆化搜索是这个题的关键,几乎所有的DP都需要记忆化搜索,记忆化搜索是个非常好的技巧。另外map的构建。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: