最大递增子列问题

题目链接: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
原文地址:https://www.cnblogs.com/neverchanje/p/3451707.html