1. 程式人生 > >【洛谷P1376】機器工廠

【洛谷P1376】機器工廠

題目大意:給定兩個有 N 個數的序列 A,B,每個點有一個對應的權值,現需要計算答案的貢獻:\(B[i]*min\{A[j]+s*(i-j),j\in[1,i] \}\) 的最小值。

題解:由於 B 序列是固定的,因此可以考慮最優化與 B 對應項相乘的值即可。 可以劃分子問題,即:用 \(dp[i]\) 表示前 i 個數中對答案貢獻的最小值,因此有遞推式 \(dp[i]=min\{dp[i-1]+s,A[i] \}\)

程式碼如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e4+10;

int n,s,c[maxn],y[maxn],dp[maxn];
long long ans;

void read_and_parse(){
    scanf("%d%d",&n,&s);
    for(int i=1;i<=n;i++)scanf("%d%d",&c[i],&y[i]);
}

void solve(){
    dp[1]=c[1];
    for(int i=2;i<=n;i++)dp[i]=min(dp[i-1]+s,c[i]);
    for(int i=1;i<=n;i++)ans+=(long long)y[i]*dp[i];
    printf("%lld\n",ans);
}

int main(){
    read_and_parse();
    solve();
    return 0;
}