當前位置:編程學習大全網 - 源碼下載 - hdu 3507 為何有錯?

hdu 3507 為何有錯?

題目大意給定壹個長度為n的序列,和壹個常數m,我們可以將序列分成隨意段,每段的權值為sum(arr[i]) + C(x<=i<=y),求壹種劃分方法使得整個序列的權值最小.n<=50萬。

解題思路做完Hdu的2829,然後再看這題,壹切變得如此簡單,用兩種方法解。

狀態轉移方程為: dp[i] = min(dp[j] + (sum[i]-sum[j])^2 + m) (j < i);

方法壹:dp[i] = dp[j] + (sum[i]-sum[j])^2 + m = dp[j] + sum[i] * sum[i] + sum[j] * sum[j] - 2 * sum[i] * sum[j] + m;

設y = dp[j] + sum[j] * sum[j],x = sum[j],那麽原式等於:dp[i] = y + 2 * sum[i] * x + m + sum[i] * sum[i],然後套下斜率優化DP模板即可ac。

方法二:方法二使用的優化技巧類似於四邊形不等式,用個s[i] 記錄dp[i]由前面的哪個狀態轉移過來,然後枚舉的時候只要枚舉s[i-1] 到i-1就可以了。

第二種方法似乎比第壹種要慢壹些,常數比較大。

AC源代碼

#include <stdio.h>

#include <string.h>

#define MAX 510000

#define int64 long long

struct point{

int64 x,y,c;

}pot[MAX];

int n,m,arr[MAX];

int64 sum[MAX],dp[MAX];

int qu[MAX],head,tail;

int CheckIt(int x,int y,int z) {

point p0 = pot[x],p1 = pot[y],p2 = pot[z];

return (p0.x -p1.x) * (p0.y - p2.y) - (p0.y - p1.y) * (p0.x - p2.x) <= 0;

}

int NotBest(int x,int y,int k) {

point p0 = pot[x],p1 = pot[y];

return p0.y - k * p0.x > p1.y - k * p1.x;

}

int64 Solve_DP() {

head = tail = 0;

qu[tail] = 0;

pot[0].x = pot[0].y = 0;

for (int i = 1; i <= n; ++i) {

pot[i].x = sum[i-1];

pot[i].y = dp[i-1] + sum[i-1] * sum[i-1];

while (head <= tail - 1 &&

CheckIt(qu[tail-1],qu[tail],i)) tail--;

qu[++tail] = i;

while (head + 1 <= tail &&

NotBest(qu[head],qu[head+1],2 * sum[i])) head++;

int k = qu[head];

dp[i] = pot[k].y - 2 * sum[i] * pot[k].x + sum[i] * sum[i] + m;

}

return dp[n];

}

int64 Solve_DP2() {

for (int64 mmin,i = 1; i <= n; ++i) {

mmin = -1;

for (int j = qu[i-1]; j < i; ++j)

if (mmin == -1 ||

dp[j] + (sum[i] - sum[j]) * (sum[i] - sum[j]) < mmin) {

mmin = dp[j] + (sum[i] - sum[j]) * (sum[i] - sum[j]);

qu[i] = j;

}

dp[i] = mmin + m;

}

return dp[n];

}

int main()

{

int i,j,k;

while (scanf("%d%d",&n,&m) != EOF) {

for (i = 1; i <= n; ++i)

scanf("%d",&arr[i]),sum[i] = arr[i] + sum[i-1];

int64 ans = Solve_DP2();

printf("%lld\n",ans);

}

}

  • 上一篇:誠心求好玩的單機遊戲
  • 下一篇:iOS 16被曝UI改動明顯,將於6月推出
  • copyright 2024編程學習大全網