HDU 1160 FatMouse's Speed 最长上升子序列,重拾DP

最简单的DP。。。并且在被提示了考虑dp[i]为i结尾的子序列的最长子序列,各种姿势还是没做出来。。

把体重降序排列,就变成了求速度的最长上升子序列,输出正是按次要求,也不用再倒序;

n<1000

n^2复杂度足以;但是LIS有nlogn的算法:点击打开链接

/* ***********************************************
Author        :angon
************************************************ */
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define REP(i,k,n) for(int i=k;in2.w || (n1.w==n2.w && n1.s t[j].s && dp[i]dp[j]就没必要再管
            {
                dp[i]=dp[j]+1;
                pre[i]=j;
                if(dp[i]>maxlen)
                {
                    maxlen=dp[i];
                    edx=i;
                }
            }
        }
    }
    printf("%d\n",maxlen);
    REP(i,0,maxlen)
    {
        printf("%d\n",t[edx].id);
        edx=pre[edx];
    }
    return 0;
}


nlogn模版


#include   
using namespace std;  
int find(int *a,int len,int n)//修改后的二分查找,若返回值为x,则a[x]>=n  
{  
    int left=0,right=len,mid=(left+right)/2;  
    while(left<=right)  
    {  
       if(n>a[mid]) left=mid+1;  
       else if(n>n)  
    {  
        for(i=0;i>a[i];  
        b[0]=1;  
        c[0]=-1;  
        c[1]=a[0];  
        len=1;//此时只有c[1]求出来,最长递增子序列的长度为1.  
        for(i=1;ilen)//要更新len,另外补充一点:由二分查找可知j只可能比len大1  
                len=j;//更新len  
        }  
        cout<


你可能感兴趣的:(HDU 1160 FatMouse's Speed 最长上升子序列,重拾DP)