【洛谷P1376】机器工厂

题目大意:给定两个有 N 个数的序列 A,B,每个点有一个对应的权值,现需要计算答案的贡献:(B[i]*min{A[j]+s*(i-j),jin[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
",ans);
}

int main(){
	read_and_parse();
	solve();
	return 0;
}
原文地址:https://www.cnblogs.com/wzj-xhjbk/p/9982722.html