动态规划-最大子串 HDOJ1003
2013-11-04 21:43
288 查看
题目大意:输入是具有n个整数的向量x,输出是输入向量的任何联系子向量中的最大和,并输出该子向量的开始和结束为止。例如:
输入:
5 6 -1 5 4 -7
7
0 6 -1 1 -6 7 -5
输出:
Case 1:14 1 4
Case 2:7 1 6
分别有四种方法都能够求解出来分别是O(n^3)和O(n^2)以及O(n)但是只有分治算法和扫描算法能够AC,前两种都会超时。《编程珠玑》里面在第八章讲这个问题时有一句经典的话:任何正确的算法都必须至少花费O(n)的时间,所以最后的扫描算法已经很高效了,不需要优化了。
扫描算法代码如下复杂度O(N):
平法算法(O(n^2)运行时会超时:
输入:
5 6 -1 5 4 -7
7
0 6 -1 1 -6 7 -5
输出:
Case 1:14 1 4
Case 2:7 1 6
分别有四种方法都能够求解出来分别是O(n^3)和O(n^2)以及O(n)但是只有分治算法和扫描算法能够AC,前两种都会超时。《编程珠玑》里面在第八章讲这个问题时有一句经典的话:任何正确的算法都必须至少花费O(n)的时间,所以最后的扫描算法已经很高效了,不需要优化了。
扫描算法代码如下复杂度O(N):
//time:328MS mem:548k #include <iostream> using namespace std; int main() { int T; cin>>T; short a[100002]; for(int k=1;k<=T;k++) { int n,locl,locr,max,ssum; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; max = a[1]; ssum = 0; locl = 1; locr = 1; int temp = 1; for(int i=1;i<=n;i++) { ssum += a[i]; if(ssum>max) { max = ssum; locl = temp; locr = i; } if(ssum<0) { ssum = 0; temp = i+1; } } cout<<"Case "<<k<<":"<<endl; cout<<max<<" "<<locl<<" "<<locr<<endl; if(k<=T-1) cout<<endl; } return 0; }
平法算法(O(n^2)运行时会超时:
#include <iostream> using namespace std; int main() { int T; cin>>T; short a[100002]; short sum[100002]; for(int k=1;k<=T;k++) { int n; cin>>n; for(int i=1; i<=n; i++) { cin>>a[i]; } sum[0]=0; sum[1] = a[1]; for(int j=2; j<=n;j++) sum[j] = a[j]+sum[j-1]; int max = a[0]; int ssum; int locl=0,locr=0; for(int i=1;i<=n;i++) { for(int j=i;j<=n;j++) { ssum = sum[j]-sum[i-1]; if(ssum>max) { max = ssum; locl = i; locr = j; } } } cout<<"Case "<<k<<":"<<endl; cout<<max<<" "<<locl<<" "<<locr<<endl; } return 0; }
相关文章推荐
- hduoj1003,Max Sum,最大子序列和,类动态规划,经典
- 动态规划:最大子串和
- 动态规划题目(三)——最大连续乘积子串
- HDU1024 Max Sum Plus Plus(DP动态规划 最大子串和增强版)
- 动态规划--求最大连续子串之和
- js算法:动态规划-最大公共子串与最大子段和
- HUD 1003/HDU 1081:动态规划之最大子序列和+最大矩阵和
- HDOJ1003(最大连续子串)
- hdoj-1003及动态规划理解
- 最大连续子序列和,乘积,最长递增子串,最长公共子串,子序列等问题(动态规划等)
- 动态规划解最大和子串
- 动态规划经典题:给出两个字符串s1和s2,返回其中最大的公共子串
- 动态规划——求最大子串和
- 最大子串和(HDOJ1003)
- 动态规划 字符串最大公共子序列以及最大公共子串问题LCS
- 动态规划之 longest common substring最大公共子串
- 动态规划:给出两个字符串s1和s2,返回其中最大的公共子串
- hdu 1003 Max Sum(动态规划求一维最大子段和)
- 动态规划——最大子串和
- HDOJ 1003:最大子序列|最大子串|最大连续和