最開始題目都沒看懂,看了別人的部落格才知道這道題是要求最大子串行和。
這裡我先歸納了三種求解最大子串行和問題的演算法,在最後給出該題的ac**。
直接遍歷所有可能的情況。
int maxsubsequence1(int arr, int n)
} return max_sum;
}
若將乙個序列從中分為兩半的話,該序列的和最大的子串行的位置不外乎三種情況——左邊的序列中、右邊的序列中、橫跨兩個序列,所以這裡可使用分治法來解決。
int maxsubsequence2(int arr, int left, int right)
int maxrightbordersum = 0, rightbordersum = 0;
for (int i = mid + 1; i <= right; ++i)
// 從三者中選出最大子串行的和
return max3(maxleftsum, maxrightsum, maxleftbordersum + maxrightbordersum);
}int max3(int a, int b, int c)
int maxsubsequence3(int arr, int n)
return max_sum;
}
#include using namespace std;
int main()
if (sum < 0)
} // 5 1 -1 4 -5 3
printf("case %d:\n", j + 1);
printf("%d %d %d\n", max_sum, start, end);
if (j < n_case - 1)
printf("\n"); }
return 0;
}
HDOJ1003 求最大子列
思路 既然要求乙個數列中最大子列的值。第一種思路 暴力,直接遍歷這個數列,但最大的數列元素個數有10000個,所以肯定超時 所以想到第二種方法 只需要遍歷一遍這個數列。從第乙個數字一直往後加,求和,如果和乙隻在增大,那麼不斷更新最大值和 上限 題目輸出要求中的第三個數字 如果碰到所求和比最大值小了那...
動態規劃 最大子串 HDOJ1003
題目大意 輸入是具有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 ...
最大子串行和 HDOJ 1003 Max Sum
題目傳送門 題意 求mcs 最大連續子串行和 及兩個端點 分析 第一種辦法 dp i max dp i 1 a i a i 可以不開陣列,用乙個sum表示前i個數字的mcs,其實是一樣的。類似dp的做法有個名字叫聯機演算法。第二種辦法 乙個字首記錄前i個數字的和,那麼ans sum mn mn表示前...