zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    EF6 Code First 模式更新数据库架构
    bootstrap-datepicker 插件修改为默认中文
    常用网络资源下载
    jQuery框架学习第十一天:实战jQuery表单验证及jQuery自动完成提示插件
    AngularJS实现原理
    [个人翻译]GitHub指导文件(GitHub Guides[Hello World])
    年后跳槽如何准备?
    前端学数据库之子查询
    Ionic实战 自动升级APP(Android版)
    读书笔记:《HTML5开发手册》Web表单
  • 原文地址:https://www.cnblogs.com/albert67/p/10332175.html
Copyright © 2011-2022 走看看