题意:找到体重递增速度递降的最长序列
分析:和最长递增子序列一样,不过这里先做处理:先把体重按递增排序,然后找最长递降子序列即可
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
struct node{
int w,s;
int t;
}a[2000];
int n,i;
struct h{
int x;
int pre;
}dp[2000];
int ans[2000],g;
bool cmp(node p,node q)
{
if(p.w!=q.w) return p.w<q.w;
return p.s>q.s;
}
int max(int p,int q)
{
return p>q?p:q;
}
void prin(int index)
{
int j=index;
if(dp[j].pre!=j){
prin(dp[j].pre);
cout<<a[j].t<<endl;
}
else cout<<a[j].t<<endl;
return;
}
int main()
{
i=0,g=0;
int mx=-1,index;
while(cin>>a[i].w>>a[i].s) i++;
for(int j=0;j<i;j++){
a[j].t=j+1;
}
sort(a,a+i,cmp);
for(int j=0;j<i;j++){
dp[j].x=1;
dp[j].pre=j;
}
for(int j=0;j<i;j++){
for(int k=0;k<j;k++){
if(a[k].s>a[j].s&&a[k].w!=a[j].w){
if(dp[j].x<dp[k].x+1){
dp[j].x=dp[k].x+1;
dp[j].pre=k;
}
}
if(mx<dp[j].x){
mx=dp[j].x;
index=j;
}
}
}
cout<<mx<<endl;
prin(index);
}HDU 1160 FatMouse's Speed--dP--(元素1递增元素2递降的最长子序列)
原文地址:http://blog.csdn.net/ac_0_summer/article/details/46491419