题目:寻找最长上升自序列。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct node
{
int w,s; //重量,速度
int num; //编号
int t; //用来记录当前编号前面的最优解的编号
}root[1010];
bool cmp(node a,node b) //先按照重量最小排,然后按照速度最大排
{
if(a.w!=b.w)
return a.w<b.w;
return a.s>b.s;
}
int main()
{
int x,y,i=0,j;
int dp[1010]; //dp数组用来记录当前编号对应的最优解
memset(root,0,sizeof(root));
while(cin>>x>>y)
{
dp[i]=1;
root[i].num=i+1;
root[i].w=x;root[i++].s=y;
}
int n=i,ans=0;
sort(root,root+n,cmp);
for(i=0;i<n;i++)
cout<<root[i].num<<":"<<root[i].w<<" "<<root[i].s<<endl;
for(i=0;i<n;i++)
{
int p=-1; //记录当前编号前面的最优解的编号
for(j=0;j<i;j++)
if(root[i].w>root[j].w&&root[i].s<root[j].s)
{
if(dp[i]<dp[j]+1)
dp[i]=dp[j]+1,p=j;
}
if(p>=0) root[i].t=p;
if(dp[ans]<dp[i]) ans=i;
}
cout<<dp[ans]<<endl;
int t=dp[ans],p=ans;
n=dp[ans];
while(t) //类似递归来寻找对应的序列
{
dp[t]=root[p].num; //节省空间,请原谅我的节俭^ ^
p=root[p].t;
t--;
}
for(i=1;i<=n;i++)
cout<<dp[i]<<endl;
return 0;
}