题目链接:https://www.cometoj.com/contest/58/problem/C?problem_id=2760
一道动态规划解决的题目。
dp[i][0]:从第1到第i个都没有被更新的最优答案
dp[i][1]:前面的不用管,第i个一定被更新,要么是第一个,要么在中间
dp[i][2]:前面有一段已经被更新,第i个要么是区间末尾,要么不被更新
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
ll a[maxn];
ll b[maxn];
ll dp[maxn][3];
ll n,k;
int main() {
cin>>n>>k;
for(int i=1;i<=n;++i)
{
cin>>a[i]>>b[i];
}
for(int i=1;i<=n;++i)
dp[i][0]=dp[i-1][0]+a[i+1]*b[i];
for(int i=1;i<=n;++i)
{
dp[i][1]=min(dp[i-1][0]+k*a[i+1]*b[i],dp[i-1][1]+k*k*a[i+1]*b[i]);
}
for(int i=1;i<=n;++i)
{
dp[i][2]=min(dp[i-1][1]+k*a[i+1]*b[i],dp[i-1][2]+a[i+1]*b[i]);
}
cout<<dp[n][2]<<endl;
return 0;
}