任意門
題意:略
解析:動態規劃,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...