hdu1160 FatMouse's Speed

题意:求一个上升序列长度,和输出序号。这里就需要我们标记最初序号,用一个pre[]回溯回去。总之很水的dp。

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int w,v,t;
}a[1000+10];
bool cmp(node a,node b)
{
     return a.w==b.w ? a.v>b.v : a.w<b.w;
}
int dp[1010],pre[1010];
void print(int x)
{
    if(pre[x]!=-1) print(pre[x]);
    printf("%d\n",a[x].t+1);
}
int main()
{
    int x,y,n=0;
    while(~scanf("%d%d",&x,&y)){
        a[n].w=x;a[n].v=y;a[n].t=n;n++;
    }
    sort(a,a+n,cmp);
    memset(pre,-1,sizeof(pre));
    int Max=0,index;
    for(int i=0;i<=n;i++) dp[i]=1;
    for(int i=1;i<n;i++){
       for(int j=0;j<i;j++){
          if(a[i].v<a[j].v&&a[i].w>a[j].w){
              if(dp[i]<dp[j]+1){
                 dp[i]=dp[j]+1;
                 pre[i]=j;
                 if(dp[i]>Max){
                    Max=dp[i];
                    index=i;
                 }
              }
          }
       }
    }
    cout<<Max<<endl;
    print(index);
}

你可能感兴趣的:(dp)