HDU 1003 Max Sum 动态规划 || 尺取法
2018-03-28 21:20
381 查看
题目:
http://acm.hdu.edu.cn/showproblem.php?pid=1003题意:
给出一个长度为n的序列,求出这个序列中的子序列,使其和最大,输出和已经子序列的左右端点下标思路:
有动态规划和尺取法两种方法代码:
动态规划:#include <bits/stdc++.h> using namespace std; const int N = 100000 + 10; int a , dp ; int main() { int t, n, cas = 0; scanf("%d", &t); while(t--) { scanf("%d", &n); for(int i = 1; i <= n; ++i) scanf("%d", &a[i]); int ans = INT_MIN, ansl = 0, ansr = 0; int l = 1, r = 1; for(int i = 1; i <= n; ++i) { if(dp[i-1] + a[i] < a[i]) { dp[i] = a[i]; l = r = i; } else { dp[i] = dp[i-1] + a[i]; r = i; } if(dp[i] > ans) { ans = dp[i]; ansl = l, ansr = r; } } printf("Case %d:\n", ++cas); printf("%d %d %d\n", ans, ansl, ansr); if(t) puts(""); } return 0; }
尺取法:
#include <bits/stdc++.h> using namespace std; const int N = 100000 + 10; int a , dp ; int main() { int t, n, cas = 0; scanf("%d", &t); while(t--) { scanf("%d", &n); for(int i = 1; i <= n; ++i) scanf("%d", &a[i]); int ans = INT_MIN, ansl = 0, ansr = 0; int l = 1, r = 1, sum = 0; for(int i = 1; i <= n; ++i) { sum += a[i]; if(sum > ans) { ans = sum; ansl = l, ansr = i; } if(sum < 0) { sum = 0; l = i+1; } } printf("Case %d:\n", ++cas); printf("%d %d %d\n", ans, ansl, ansr); if(t) puts(""); } return 0; }
相关文章推荐
- hdu 1003 Max Sum 动态规划
- HDU 1003 Max Sum 动态规划
- hdu-1003-Max Sum-动态规划dp
- HDU-1003- Max Sum (动态规划)
- HDU 1003 Max Sum 动态规划
- HDU:1003 Max Sum(动态规划DP)
- hdu 1003 Max Sum 简单动态规划
- HDU 1003 Max Sum【动态规划求最大子序列和详解 】
- HDU 1003 Max Sum(动态规划)
- 动态规划 HDU - 1003 Max Sum(最大子段和)
- HDU 1003 Max Sum-动态规划
- hdu 1003 Max Sum----动态规划
- HDU 1003 Max Sum(连续子列的最大和,动态规划)
- hdu 1003 Max Sum(动态规划)
- HDU 1003 Max Sum (动态规划)
- 动态规划——Hdu_1003_Max Sum
- HDU-1003 Max Sum-动态规划-难度2
- 动态规划之HDU-1003 Max Sum
- HDU-1003 Max Sum 动态规划
- [动态规划]hdu 1003 Max Sum 最大子列