题目链接:https://www.cometoj.com/contest/58/problem/C
分析:一个dp题,关键是怎么设计,详细见代码注释
Ac code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
ll a[maxn],b[maxn];
ll dp[maxn][3];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%lld%lld",&a[i],&b[i]);
for(int i=1;i<=n;i++)
{
dp[i][0]=dp[i-1][0]+b[i-1]*a[i];///dp[i][0]表示前i个都没选
dp[i][1]=min(dp[i-1][1]+b[i-1]*a[i]*k*k,dp[i-1][0]+b[i-1]*a[i]*k);///dp[i][1]表示第i个选了
dp[i][2]=min(dp[i-1][2]+b[i-1]*a[i],dp[i-1][1]+b[i-1]*a[i]*k);///dp[i][2]表示第i个没选
}
printf("%lld\n",*min_element(dp[n],dp[n]+3));///最终答案要么是第n个没选,要么是第n个选了,或者全部都没选
return 0;
}