蒟蒻DP專題訓練2--HDU1231
阿新 • • 發佈:2019-01-26
簡單的一維dp,但是怕會超int,一定要開成long long,注意讀取和列印都是lld,否則會出錯。然後,題目裡面說如果全是負數則輸出第一個元素和最後一個元素,還是要審題。然後在每次遇到轉移情況為重開區間的時候,要更新區間左值和右值,然後在尋找最大值的時候記錄一下最大值和相應的區間左右值就好了,一次AC,程式碼如下:
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<cstdlib> #include<cstdio> #include<cmath> #include<cstring> #include<vector> #include<map> #include<algorithm> #include<queue> #include<stack> using namespace std; typedef long long ll; ll a[10010]; ll dp[10010];//dp[i]表示以i為結尾的最大連續子序咧的和 int res[10010]; int main() { int n; ll fmax = -0x3f3f3f3f; while(~scanf("%d", &n) && n != 0) { int l = 1, r = 1, l1 = 1, r1 = 1, flag = 0; memset(dp, 0, sizeof(dp)); memset(res, 0, sizeof(res)); for(int i = 1; i <= n; i++) { scanf("%lld", &a[i]); if(a[i] >= 0) flag = 1; } if(!flag) { printf("0 %lld %lld\n", a[1], a[n]); continue; } fmax = a[1]; dp[1] = a[1]; for(int i = 2; i <= n; i++) { if(dp[i-1]+a[i] > a[i]) { dp[i] = dp[i-1]+a[i]; r = i; if(dp[i] > fmax) { fmax = dp[i]; l1 = l, r1 = r; } } else { dp[i] = a[i]; l = i; r = i; if(dp[i] > fmax) { fmax = dp[i]; l1 = l, r1 = r; //printf("i:%d dp=%lld l:%d r:%d\n", i, dp[i], l, r); } } //printf("i:%d dp=%lld l:%d r:%d l1:%d r1:%d\n", i, dp[i], l, r, l1, r1); } printf("%lld %lld %lld\n", fmax, a[l1], a[r1]); } return 0; }