我的思路:
1、以前是有做过hdoj上一个最长递增子序列的,想想那个比较麻烦,然后我使用和卖股票一样的算法。还把数组转换了一次,想想真是傻。
2、下面是我要丑哭的代码。实在不想贴出来。
int maxSubArray(int A[], int n) {
if (n < 0)
return 0;
int input[n];
input[0] = A[0];
for (int i = 1; i < n; i++)<span style="white-space:pre"> </span>//这里是把数组转换成和卖股票一样的,别人的代码就没有转,直接使用累加和来计算
input[i] = input[i - 1] + A[i];
int sum = 0;
int min = 0, min_i = -1;<span style="white-space:pre"> </span>//转换之后第一个数设定为0,也就是最前面的减数
for (int i = 0; i < n; i++)
if (min > input[i]) {
min = input[i];
min_i = i;
}
else
if (input[i] - min > sum)
sum = input[i] - min;
if (min_i >= 0 && A[min_i] > 0)
return sum + A[min_i];
else if (sum == 0) {<span style="white-space:pre"> </span>//sum等于0就说明数列中所有数都小于0,最大的数就可以完成目标
int max = A[0];
for (int i = 1 ; i < n ; i++)
if (max < A[i])
max = A[i];
return max;
}
return sum;
}
别人思路:
1、这题就是用的卖股票的思路。不过别人思路比我要清晰很多。
int maxSubArray(int A[], int n) {
if (n < 0)
return 0;
int sum = 0, ans = 0;
for (int i = 0; i < n; i++) {
sum += A[i];
if (sum < 0)
sum = 0;
if (sum > ans)
ans = sum;
}
if (ans == 0) {
ans = A[0];
for (int i = 0; i < n; i++)
if (A[i] > ans)
ans = A[i];
}
return ans;
}
参考链接:
最大子数组算法
下面的参考链接是关于最长递增子序列的求法:最长递增子序列