hdu 1160

来源:互联网 发布:网络电视机顶盒多少钱 编辑:程序博客网 时间:2024/05/17 01:01

下次做题的时候不能中途干其他的了,写着写着忘记之前写的是什么意思了,白白浪费很长时间。

对重量进行升序排序,如果重量相等则也按速度降序排序。

之后就是LIs了。

用一个二维数组dp[len][2],dp[][0]用来记录递增序列的长度,dp[][1]用来记录维持此长度的前一个坐标。

逆序打印出来就是了。

看网上其他的用的数据结构真不好想的。膜拜下。

import java.util.Arrays;import java.util.Scanner;class M implements Comparable{     public int w,s,id;    public M(int w,int s,int id)    {         this.w=w;        this.s=s;        this.id=id+1;    }     public int compareTo(Object o)     {         int t=w-((M)o).w;         if(t!=0)return t;        return s-((M)o).s;    }     }public class Main{    public static void main(String[] args)    {        Scanner cin=new Scanner(System.in);        M m[]=new M[10001];        int len=0,max=0,id=0,k=0;;        while(cin.hasNext())         {            int w=cin.nextInt();            int s=cin.nextInt();            m[len]=new M(w,s,len);            len++;        }        Arrays.sort(m,0,len);        int dp[][]=new int[len][2];        for(int i=1;i<len;i++)        {            dp[i][0]=1;            for(int j=0;j<i;j++)            {                if(m[j].s>m[i].s&& dp[i][0]<dp[j][0]+1)                {                    dp[i][0]=dp[j][0]+1;                    dp[i][1]=j;                }            }            max=Math.max(max, dp[i][0]);        }        System.out.println(max);        int index[]=new int[max];        for(int i=len-1;i>=0;i--)//以下是求坐标索引        {            if(dp[i][0]==max)            {                index[k++]=m[i].id;                id=i;break;            }        }        for(int i=0;i<max-1;i++)        {            index[k++]=m[dp[id][1]].id;            id=dp[id][1];        }        for(int i=max-1;i>=0;i--)System.out.println(index[i]);    }}

原创粉丝点击