好好想了一下,觉得不能再这样到处做题了,必须得有个方向,有目的的做。否则就算做得再多,结果也不一定就如人意。在网上仔细找了一下,学习了别人的经验,决定把一些常见的问题搞懂再说,然后找了一些各个OJ上比较有代表性的各个方面、各种算法的题目,争取尽自己的努力一个一个把它们击破。另外,写好解题报告,既是对知识的一种熟练,也是一种巩固。
POJ 2593 Max Sequence
考察点:动态规划
思路:虽然题目给出了3000ms的时间,但考虑到数据量可以达到100000,如果用O(N^2)的算法的话,还是极有可能会超时的,于是决定采用这种O(N)时间效率的动规。在输入的同时,进行一次DP,计算出从左到右的最大值,并把它保存在数组dp的对应的下标元素中,这样之后,对于下标为i 的元素,它其中保存的便是前面所有元素可能的最大连续和。再从右到左进行一次DP,计算从右到左的最大连续和。假设此时已经算到下标为i的元素,那么将 sum+dp[i-1]与ans进行比较,将ans取较大者。
提交情况:Accepted 1次
收获:对这种比较明显的DP问题有了弄深的理解,同时也对时间效率这个概念有了点印象。
www.Examda.CoM考试就到考试大 AC Code
#include <iostream>
using namespace std;
int data[100000], dp[100000];
int main()
{
int n;
while(cin>>n){
if(!n)
break;
int sum = 0, tmp = -999999999;
for(int i = 0; i < n; i++){
scanf("%d", &data[i]);
sum += data[i];
if(sum > tmp)
tmp = sum;
dp[i] = tmp;
if(sum < 0)
sum = 0;
}
sum = 0;
int ans = -999999999;
for(int i = n-1; i > 0; i--){
sum += data[i];
if(dp[i-1]+sum > ans)
ans = dp[i-1]+sum;
if(sum < 0)
sum = 0;
}
cout<<ans<<endl;
}
return 0;
}
责任编辑:小草