uva 10131 Is Bigger Smarter?

来源:互联网 发布:报表数据分析实例 编辑:程序博客网 时间:2024/06/06 14:18

   近几天刚开始接触dp。

队友推荐的第一道题(最长上升子序列)  就是要严格按照递增顺序走的   。

先排好序,然后就跟矩阵嵌套一样。

其实有个二分的,只不过貌似不能用在这道题上,因为要输出路径的。

代码如下:

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int M=1002;struct node{    int wei;    int iq;    int id;} p[M];int path[M];int dp[M];int MAX=-1;int k=-1;int cmp(node a,node b){    if(a.wei!=b.wei)        return a.wei<b.wei;    if(a.iq!=b.iq)        return a.iq>b.iq;}int n;//int lis()//{//    b[0]=p[0].id;//    int cur=1;//    for(int i=0; i<n; i++)//    {//        int j=lower_bound(b,b+cur,p[i].id)-b;//        b[j]=p[i].id;//        if(j>=cur)//            cur++;//    }//    return cur;//}void print(int i){    if(MAX--)    {        print(path[i]);        printf("%d\n",p[i].id);    }}int main(){    //freopen("in.txt","r",stdin);    n=0;    while(~scanf("%d%d",&p[n].wei,&p[n].iq))    {        p[n++].id=n;    }    sort(p+1,p+n+1,cmp);    for(int i=1;i<n;i++)    {        path[i]=1;        dp[i]=1;    }    for(int i=1; i<n; i++)        for(int j=1; j<i; j++)        {            if(p[i].wei>p[j].wei&&p[i].iq<p[j].iq&&dp[i]<dp[j]+1)            {                dp[i]=dp[j]+1;                path[i]=j;            }            if(dp[i]>MAX)            MAX=dp[i],k=i;        }    printf("%d\n",MAX);    print(k);    return 0;}


0 0
原创粉丝点击