您的位置:首页 > 其它

Uva 10131 Is Bigger Smarter 最长递减子序列

2013-07-23 22:40 162 查看
  这道题刚开始看到时候就知道怎么做了  然后就写啦    写的哪个代码那叫一个搓啊   排序还用冒泡   后来一看别人的都是sort   瞬间感觉自己弱爆了

分析:这道题的关键就是先排序  接着就是求最长递减子序列了(dp判断的时候一定要注意是严格的递增和递减)  答案不唯一    还要记录路径  递归找路径非常容易 

下面是代码   写得还是有点搓

#include<cstdio>
#include<cstring>
#include<algorithm>

const int maxn = 1005;
int dp[maxn],pre[maxn],str[maxn],T;

struct elephant//定义结构体
{
int w;
int s;
int num;
} st[maxn];

int cmp(elephant x,elephant y)
{
if(x.w<y.w)
{
return 1;//不交换
}
else if(x.w==y.w)
{
if(x.s>y.s)
{
return 1;
}
}
return 0;//交换
}

void printPath(int t)
{
str[T++]=st[t].num;
if(pre[t]){
printPath(pre[t]);
}
}

using namespace std;
int main()
{
int N;
for(N = 1;scanf("%d%d",&st
.w,&st
.s)==2 ; N++)
st
.num = N;
N--;
int i,j;
sort(st+1,st+N+1,cmp);
for(int i = 0; i < N; i++)
printf("%d\n",st[i].w);
memset(dp,0,sizeof(dp));//初始化dp数组
int ans = 1,temp = 0,max;
for(i=2; i<=N; i++)//dp求一个最优解
{
max = 0;
for(j=i-1; j>=1; j--)
if(st[i].s<st[j].s&&st[i].w>st[j].w&&dp[j]>max)//必须要求dp[j]中的最大值
{
max = dp[j];
pre[i]=j;//记录前驱
}
dp[i] = max+1;
}
max = 0;
for( i = 1; i <= N; i++)
if(max<dp[i]){max = dp[i];temp = i;}
printf("%d\n",max);
printPath(temp);
for(i = --T; i >= 0; i--)
printf("%d\n",str[i]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息