zoukankan      html  css  js  c++  java
  • 最大递增子列问题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003

    Hdu1003 Max Sum  

    #include <iostream>
    using namespace std;
    const int sd = 1 << (sizeof(int)* 8-1);
    
    int main (){
        int T,N;
        cin>>T;
        int maxSum ,end , begin , newbegin , curSum;
        int k=1;
        while ( k<=T )
        {
            curSum = end = begin = newbegin = 0;
            maxSum = sd;
            cin>>N;
            int a [100010];
            for ( int i=0; i<N; i++ ) 
                cin>>a[i];
            cout<<"Case "<<k<<":
    ";
            for ( int i=0; i<N; i++ )
            {
                
                curSum += a[i];
                if ( curSum > maxSum )
                {
                    maxSum = curSum;
                    end = i;
                    begin = newbegin;
                }
                if ( curSum < 0 ) 
                {
                    curSum = 0;
                    newbegin = i+1;
                }
            }
            cout<<maxSum<<" "<<begin+1<<" "<<end+1;
            if ( k==T )
                cout<<endl;
            else
                cout<<endl<<endl;
            k++;
        }
    }
    View Code

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1025

    Hdu 1025 Constructing Roads In JGShining's Kingdom

     
    //输入数对p,r,输出最大对数,使得二部图中没有两条相交线 
    //没有相交线的情况line[i].p<line[i+1].p时,有line[i].r<line[i+1].r,反之亦然
    //将line[].p从小到大排序,找出line[].r的LIS 
    //由题意可知,同一个rich不会给多个poor提供resources 
    
    //最长递增序列O(nlgn)算法(本质上也是动态规划) 
    //利用一个数组b[i]来储存长度为i的最小末尾,d[maxn]为给出的数组,len为当前已求得的最大长度,i为当前元素下标 
    //若存在max(b[k])<d[i](从len逆序寻找k)则b[k+1]=d[i]
    
    //对于查找k,使得max(b[k])<d[i],可以逆序寻找,也可以采用二分法查找
    //因为b[k]一定是一个已排序的数组 
    
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    const int maxn=500005;
    
    struct node{
        int p,r;
    }line[maxn];
    
    bool cmp(node l1,node l2){
        return l1.p<l2.p;
    }
    int n,len;
    int b[maxn];
    
    int binsearc(int d,int len){//在长度为len的b数组中查找k 
        int begin=1,end=len,mid=(begin+end)/2;
        while(begin<=end)//相当注意!!!!! 
        {
            if(d>b[mid])
                begin=mid+1;
            else if(d<b[mid])
                end=mid-1;
            mid=(begin+end)/2;
        }
        return end;//可证明任何情况总能找出小于d的最大值 
    }
    
    int main(){
        int cs=1;
        while(cin>>n){
            memset(b,0,sizeof(b));
            for(int i=1;i<=n;i++)
                cin>>line[i].p>>line[i].r;
            sort(line+1,line+n+1,cmp);
            len=0;
            for(int i=1;i<=n;i++)
            {
                int k=binsearc(line[i].r,len);
                if(k==len)
                    len++;
                b[k+1]=line[i].r;
            }
            if(len<=1)
                cout<<"Case "<<cs++<<":
    My king, at most "<<len<<" road can be built.
    
    ";
            else
                cout<<"Case "<<cs++<<":
    My king, at most "<<len<<" roads can be built.
    
    ";
        }
        return 0;
    }
    View Code
  • 相关阅读:
    hbase Compaction
    hadoop集群 动态添加或删除节点
    Hadoop节点迁移
    Spark程序运行常见错误解决方法以及优化
    用python执行sql来验证数据是否准时导入了目标库
    kylin2.3版本启用jdbc数据源(可以直接通过sql生成hive表,省去手动导数据到hive,并建hive表的麻烦)
    phoenix 二级索引使用实践
    jenkins任务失败,发送邮件通知
    Coolite学习
    MySql连接和授权命令
  • 原文地址:https://www.cnblogs.com/neverchanje/p/3451707.html
Copyright © 2011-2022 走看看