zoukankan      html  css  js  c++  java
  • hdu 1160 FatMouse's Speed (DP)

    点击打开链接

    1,把问题转换为最长上升子序列来做,先把体重或速度排序,然后状态转移方程是dp[i]=max(dp[j])+1,其中(0<j<i && w[i]>w[j] && s[i]<s[j]) 。其中dp[i]表示以i为底的最长序列。

    2,怎么存储序列点,用index[i]存储i之前的那个点的坐标。

    3,因为在排序过程中要打乱数列,所以把位置也放在结构体中。

    #include"stdio.h"
    #include"stdlib.h"
    #include"string.h"
    struct node
    {
        int n,w,s;
    }mice[1111];
    int dp[1111];
    int index[1111],a[1111];
    int cmp(const void*a,const void*b)
    {
        return (*(struct node*)a).w-(*(struct node*)b).w;
    }
    int main()
    {
        int lv=1;
        int i,j,k,max;
        memset(index,-1,sizeof(index));
        while(scanf("%d%d",&mice[lv].w,&mice[lv].s)!=EOF)
        {
            mice[lv].n=lv;
            lv++;
        }
        qsort(mice,lv,sizeof(mice[0]),cmp);
        for(i=0;i<=lv;i++)
            dp[i]=1;
        for(i=2;i<lv;i++)
        {
            for(j=1;j<i;j++)
            {
                if(mice[i].s<mice[j].s)
                {
                    if(dp[j]+1>dp[i])
                    {
                        dp[i]=dp[j]+1;
                        index[mice[i].n]=mice[j].n;
                    }
                }
            }
        }
    	
        for(max=-1,i=1;i<=lv;i++)
        {
            if(dp[i]>max)
            {
                max=dp[i];
                k=mice[i].n;
            }
        }
        printf("%d\n",max);
        for(i=max;i>=1;i--)
        {
            a[i]=k;
            k=index[k];
        }
        for(i=1;i<=max;i++)
            printf("%d\n",a[i]);
        return 0;
    }


  • 相关阅读:
    滑动窗口算法-2
    滑动窗口算法-1
    工作中缓存使用重点
    QPS的计算方法[转载]
    springAop
    spring配置详述与springboot
    LRU最少使用
    图片压缩
    Javassist使用[转载]
    [转]关于Spring事务嵌套回滚的一些测试总结
  • 原文地址:https://www.cnblogs.com/yyf573462811/p/6365193.html
Copyright © 2011-2022 走看看