码迷,mamicode.com
首页 > 其他好文 > 详细

kuangbin专题十二 基础DP1【从入门到熟练】【9+1题】

时间:2019-01-04 22:01:14      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:fine   code   std   amp   one   区间   ems   div   位置   

HDU1024 Max Sum Plus Plus

感觉这题是整个系列里难度最高的题之一?

技术分享图片
#include<bits/stdc++.h>
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<vector>
#define inf 2e9
#define maxnode 200000
#define ll long long
#define lowbit(x) (x&(-x))
const int mod = 998244353;
const int maxn = 1e6 + 10;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
using namespace std;

int a[maxn];
int dp[maxn][2],pre[maxn][2];//pre[i]是从合法位置到i的dp最大值

int main(){ 
    //ios::sync_with_stdio(false);
    int m,n;
    while( scanf("%d%d",&m,&n)!=EOF ){
        memset(dp,0,sizeof(dp));
        memset(pre,0,sizeof(pre));
        for(int i=1;i<=n;i++) scanf("%d",a+i);
        //前i个数找j个区间的最大和
        
        int last=0,now=1;//滚动数组
        //初始状态就是i=0的时候,都是dp[0][j]=0,那pre自然也是0

        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                if(j<i) continue;
                if(j==i) { dp[j-1][now]=-inf;  pre[j-1][now]=-inf; }//该子问题非法

                dp[j][now] = max(dp[j-1][now],pre[j-1][last])+a[j];
                pre[j][now] = max( pre[j-1][now],dp[j][now] );
            }
            last = !last;
            now = !now;
        }
        cout<<pre[n][last]<<endl;

    }

    
    return 0;
}
View Code

 

kuangbin专题十二 基础DP1【从入门到熟练】【9+1题】

标签:fine   code   std   amp   one   区间   ems   div   位置   

原文地址:https://www.cnblogs.com/ZhenghangHu/p/10222676.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!