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; }
原文地址:https://www.cnblogs.com/ZhenghangHu/p/10222676.html
时间: 2024-10-20 02:33:55