【洛谷P1376】機器工廠
阿新 • • 發佈:2018-11-19
題目大意:給定兩個有 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; }