Yinchuan-B The Great Wall
生活随笔
收集整理的這篇文章主要介紹了
Yinchuan-B The Great Wall
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
yinchuan-B The Great Wall
給出n個數,將其劃分為k個區間,要求每個區間當中的最大數和最小數的差值之和最大。求k從1到n的答案。
n <= 1e4
因為這個題開始學四邊形優化,其實會了之和回頭看感覺還是蠻簡單的,w(i,j)w(i,j)w(i,j)的四邊形不等式很好證明,然后用個ST表來實現O(1)O(1)O(1)的查詢,1e8的空間還是有點大,所以學著寫了滾動數組。
這個代碼是按照印象中的題意隨便糊的,就過了一下樣例,沒有在oj上進行測試。
const int N = 10010, inf = 1e9; int m[N][2], dp[N][2], STmin[N][20], STmax[N][20], lg2[N];void init(int len) {for (int k = 1; (1 << k) < len; k ++)for (int i = 1; i + (1 << k) - 1 <= len; i ++){STmin[i][k] = min(STmin[i][k - 1], STmin[i + (1 << (k - 1))][k - 1]);STmax[i][k] = max(STmax[i][k - 1], STmax[i + (1 << (k - 1))][k - 1]);}for (int i = 2; i <= len; i ++)lg2[i] = lg2[i >> 1] + 1;return; }inline int w(int l, int r) {int len = r - l + 1;int mx = max(STmax[l][lg2[len]], STmax[r - (1 << lg2[len]) + 1][lg2[len]]);int mn = min(STmin[l][lg2[len]], STmin[r - (1 << lg2[len]) + 1][lg2[len]]);return mx - mn; }int main() {int T = 1;//T = read();while (T --){int n;n = read();for (int i = 1; i <= n; i ++){STmin[i][0] = read();STmax[i][0] = STmin[i][0];}init(n);int now = 0;for (int i = 1; i <= n; i ++)dp[i][now] = w(1, i);printf ("%d\n", dp[n][now]);for (int j = 2; j <= n; j ++){now ^= 1;m[n + 1][now] = n;for (int i = n; i >= 1; i --){int mx = -inf, p;for (int k = max(m[i][now ^ 1], j - 1); k <= min(m[i + 1][now], i - 1); k ++){if (mx < dp[k][now ^ 1] + w(k + 1, i)){mx = dp[k][now ^ 1] + w(k + 1, i);p = k;}}dp[i][now] = mx;m[i][now] = p;}printf ("%d\n", dp[n][now]);}}return 0; }`總結
以上是生活随笔為你收集整理的Yinchuan-B The Great Wall的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: codeforces round721
- 下一篇: 图文详解mina框架