51Nod 1049 最大子段和 DP

2021-09-05 10:28:19 字數 1840 閱讀 9733

任意門

題意:略

解析:動態規劃,dp[i]代表以a[i]結尾的子段的最大和,最後找出最大值即可。

動態規劃的思想就是利用之前的狀態推出之後的狀態,狀態具有無後效性。

對這個題來說,分為兩步,每一步就是乙個狀態的轉移方式:

每乙個狀態dp[i] 都是從兩步中選取最優的乙個,一步是延續上乙個子段,另乙個是新起乙個子段,不用考慮後續的狀態,只需要注意這個狀態的兩步。

乙個例子:

反思1.注意資料範圍最大5000*10^9,需要用long long。2.不開dp陣列也可以,實際上整個過程只用到了當前狀態和前乙個狀態,所以也可以用兩個變數替代dp陣列。

**

#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define eps (1e-6)

#define ll long long

#define pi acos(-1.0)

#define all(a) (a.begin(),(a.end())

#define zero(a) memset(a,0,sizeof(a))

#define minus(a) memset(a,0xff,sizeof(a))

#define ios cin.tie(0) , cout.sync_with_stdio(0)

#define print(a,b) cout << "#" << (a) << " " << (b) << endl

#define debug(a,b) cout << "$" << (a) << " " << (b) << endl

#define line cout << "\n--------------------\n"

const ll inf = 1e18+100;

const int maxn = 5e4 + 5;

const int mod = 1e9+7;

int n;

ll a[maxn]; //資料範圍5000*10^9炸int

ll dp[maxn]; //表示以a[i]結尾產生的最大子段和

void confirm()

不開陣列的**:

#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define ios cin.tie(0) , cout.sync_with_stdio(0)

int n;

ll sum = 0;

void solve()

cout << maxsum;

return ;

}int main()

51Nod 1049 最大子段和

n個整數組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的連續子段和的最大值。當所給的整數均為負數時和為0。例如 2,11,4,13,5,2,和最大的子段為 11,4,13。和為20。input 第1行 整數序列的長度n 2 n 50000 第2 n 1行 n個整數 ...

51nod 1049 最大子段和

1049 最大子段和 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 n個整數組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的連續子段和的最大值。當所給的整數均為負數時和為0。例如 2,11,4,13,5,2,和最大的子段為 11,4,1...

51Nod 1049 最大子段和

1049 最大子段和 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 n個整數組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的連續子段和的最大值。當所給的整數均為負數時和為0。例如 2,11,4,13,5,2,和最大的子段為 11,4,1...