sicily 1091:Maximum Sum(week 9)

xiaoxiao2021-02-28  83

题目链接:http://soj.sysu.edu.cn/1091 动态规划 dp1[i]数组表示从左往右以i为终点最大连续和 dp2[i]数组表示从右往左以i为终点最大连续和 dp3[i]数组表示从右往左记录下到当前位置能取到的最大值,即记忆化,使调用该值不必再次循环 最终最大值_max = max(dp1[i] + dp3[i+1]) arr: 1,-1,2,2,3,-3,4,-4,5,-5 dp[1]: 1, 0,2,4,7, 4,8, 4,9, 4 dp[2]: 9, 8,9,7,5, 2,5, 1,5,-5 dp[3]: 9, 9,9,7,5, 5,5, 5,5,-5 MAX : 10,9,9,9,12,9,13,9,-4 X 故答案为13 注意考虑全为负数的情况! scanf 比 cin快很多,此题用cin一定TLE!

#include<cstdio> #include<iostream> #define INF -2147483647; using namespace std; int arr[50001],dp1[50001],dp2[50001],dp3[50001]; int test,n,_max; int main() { dp1[0] = 0; scanf("%d",&test); while(test--) { _max = INF; scanf("%d",&n); dp2[n+1] = 0; for(int i = 1;i <= n;++i) { scanf("%d",&arr[i]); dp1[i] = max(dp1[i-1] + arr[i],arr[i]); } int temp = INF; for(int i = n;i > 1;--i) { dp2[i] = max(dp2[i+1] + arr[i],arr[i]); if(dp2[i] > temp) { temp = dp2[i]; dp3[i] = dp2[i]; } else dp3[i] = temp; if(dp3[i] + dp1[i-1] > _max) _max = dp3[i] + dp1[i-1]; } printf("%d/n",_max); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-84641.html

最新回复(0)