CF466A Cheap Travel 题解
原题传送门
题意:
-
有两种地铁票,单程票一张价格为
a ,m 程票一张价格为b 。 -
给定
n,m,a,b ,求搭乘n 次地铁的最低花费。 -
数据范围:
1\leqslant n,m,a,b \leqslant1000 。
看了一下大家的题解,发现没有人用动规。我就来写一下吧。
设
-
若
i \geqslant m ,则f(i)= \min (f(i-1)+a,f(i-m)+b) 。 -
否则
f(i)= \min (f(i-1)+a,b) 。
为什么转移方程的第二条不是
综上,便不难写出代码:
#include<iostream>
using namespace std;
int f[2000],n,m,b,a;
int main(){
cin>>n>>m>>a>>b;
for(int i=1;i<=n;i++){
if(i>=m)f[i]=min(f[i-1]+a,f[i-m]+b);
else f[i]=min(f[i-1]+a,b);
}
cout<<f[n];
return 0;
}