HDU1003 Max Sum (maximum sub-segment and interval + dynamic programming)

Paste the topic
Insert picture description here

Subject to the effect I believe should all know
by means of this dynamic programming state transition
dp [i] expressed as a maximum sub-paragraph at the end of [i] and
to save space, you can dp [i] when a [i] to use
the last two considerations Situation

  • If dp[i-1] is less than 0, indicating that the previous state is an end state, then at this time dp[i], we need to update the new left endpoint index value
  • If dp[i] is greater than the current maximum sub-segment sum, just update the maximum left and right endpoint index values ​​and the maximum effective value. Do not write greater than or equal, because if you write greater than or equal, and the current test case has Multiple solutions will be covered by the following values, so that it does not meet the requirements of outputting the first left and right endpoint index values ​​in the question.
  • This is a very classic dynamic planning, I hope you take it seriously, and you must understand it.
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <string>
#include <iomanip>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <map>
#define FAST ios::sync_with_stdio(false)
#define abs(a) ((a)>=0?(a):-(a))
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define mem(a,b) memset(a,b,sizeof(a))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define rep(i,a,n) for(int i=a;i<=n;++i)
#define per(i,n,a) for(int i=n;i>=a;--i)
#define endl '\n'
#define pb push_back
#define mp make_pair
#define fi first
#define se second
using namespace std;
typedef long long int ll;
typedef __int64 bi;
typedef pair<ll,ll> PII;
const int maxn = 1e6+200;
const int inf=0x3f3f3f3f;
const double eps = 1e-7;
const double pi=acos(-1.0);
const int mod = 1e9+7;
inline int lowbit(int x){
    
    return x&(-x);}
ll gcd(ll a,ll b){
    
    return b?gcd(b,a%b):a;}
void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y){
    
    if(!b){
    
    d=a,x=1,y=0;}else{
    
    ex_gcd(b,a%b,d,y,x);y-=x*(a/b);}}//x=(x%(b/d)+(b/d))%(b/d);
inline ll qpow(ll a,ll b,ll MOD=mod){
    
    ll res=1;a%=MOD;while(b>0){
    
    if(b&1)res=res*a%MOD;a=a*a%MOD;b>>=1;}return res;}
inline ll inv(ll x,ll p){
    
    return qpow(x,p-2,p);}
inline ll Jos(ll n,ll k,ll s=1){
    
    ll res=0;rep(i,1,n+1) res=(res+k)%i;return (res+s)%n;}
inline ll read(){
    
     ll f = 1; ll x = 0;char ch = getchar();while(ch>'9'||ch<'0') {
    
    if(ch=='-') f=-1; ch = getchar();}while(ch>='0'&&ch<='9') x = (x<<3) + (x<<1) + ch - '0',  ch = getchar();return x*f; }
int dir[4][2] = {
    
     {
    
    1,0}, {
    
    -1,0},{
    
    0,1},{
    
    0,-1} };

int dp[maxn];

signed main(void)
{
    
    
	
	int t,n,c=0;
	t = read();
	while(t--){
    
    
		n = read();
		for(int i=1;i<=n;++i) dp[i] = read();
		int l = 1,r = 1,maxn = dp[1] ,curl = 1;
		for(int i=2;i<=n;++i){
    
    
			dp[i] = max(dp[i-1]+dp[i],dp[i]);
			if(dp[i-1] < 0) curl = i;
			if(dp[i] > maxn){
    
    
				// 更新最大子段和
				maxn = dp[i];
				// 更新最大结果区间的左端点和右端点
				l = curl;
				r = i;
			}
		}
		printf("Case %d:\n%d %d %d\n",++c,maxn,l,r);
		if(t) cout<<endl;
	}
}

Guess you like

Origin blog.csdn.net/YSJ367635984/article/details/113993925
Recommended