• HDOJ1024--Max Sum Plus Plus(动态规划)UnSolved


    Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To be a brave ACMer, we always challenge ourselves to more difficult problems. Now you are faced with a more difficult problem. 

    Given a consecutive number sequence S 1, S 2, S 3, S 4 ... S x, ... S n (1 ≤ x ≤ n ≤ 1,000,000, -32768 ≤ S x ≤ 32767). We define a function sum(i, j) = S i + ... + S j (1 ≤ i ≤ j ≤ n). 

    Now given an integer m (m > 0), your task is to find m pairs of i and j which make sum(i 1, j 1) + sum(i 2, j 2) + sum(i 3, j 3) + ... + sum(i m, j m) maximal (i x ≤ iy ≤ j x or i x ≤ j y ≤ j x is not allowed). 

    But I`m lazy, I don't want to write a special-judge module, so you don't have to output m pairs of i and j, just output the maximal summation of sum(i x, j x)(1 ≤ x ≤ m) instead. ^_^ 

    InputEach test case will begin with two integers m and n, followed by n integers S 1, S2, S 3 ... S n
    Process to the end of file. 
    OutputOutput the maximal summation described above in one line. 
    Sample Input

    1 3 1 2 3
    2 6 -1 4 -2 3 -2 3

    Sample Output

    6
    8
    
    
            
     

    Hint

    Huge input, scanf and dynamic programming is recommended.
    
           

    若不做任何优化,并不考虑数据大小,仅考虑样例
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int num[1000];
    int dp[10][100];
    int main(){
        int n,m;
        while(cin>>n>>m){
            for(int i=1;i<=m;i++){
                cin>>num[i];
            }
            for(int i=1;i<=n;i++){
                for(int j=1;j<=m;j++){
                    int m=-1;
                    for(int w=1;w<j;w++){
                        m=max(dp[i-1][w],m);
                    }
                    dp[i][j]=max(m,dp[i][j-1])+num[j];
                }
            }
            int ans=-1;
            for(int i=1;i<=m;i++){
                ans=max(ans,dp[n][i]);
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    #include<iostream>
    #include<algorithm>
    #include<string.h>
    using namespace std;
    int dp[1000005];
    int Max[1000005];
    int num[1000005];
    int main(){
        int m,n;
        while(cin>>m>>n){
            int k;
            for(int i=1;i<=n;i++){
                cin>>num[i];
            }
            memset(dp,0,sizeof(dp));
            memset(Max,0,sizeof(Max));
            int mmax;
            
            for(int i=1;i<=m;i++){
                mmax=-INT_MAX;
                for(int j=i;j<=n;j++){
                    dp[j]=max(dp[j-1],Max[j-1])+num[j];
                    Max[j-1]=mmax;
                    mmax=max(mmax,dp[j]);
                }
            }
            cout<<mmax<<endl;
        }
        return 0;
    }
  • 相关阅读:
    linux 读写文件 open write lseek的API和应用
    gdb 常用命令
    makefile
    c/c++ 动态库与静态库的制作和使用
    linux 常用命令
    c/c++ 网络编程 陈硕老师视频理解之ttcp
    emacs 高亮
    初识HMTL标签
    Java集合基于JDK1.8的ArrayList源码分析
    Java提高篇——equals()与hashCode()方法详解
  • 原文地址:https://www.cnblogs.com/albert67/p/10332175.html
Copyright © 2020-2023  润新知