***牛客網--最小費用
テーマはある路線の上でN個の駅があって、3種類の距離の道のりがあって、L 1、L 2、L 3、対応する価格はC 1、C 2、C 3です.その対応関係は以下の通りである:距離s運賃09,09.2つのステーション間の距離はL 3を超えない.乗客が移動する2つの駅の距離がL 3より大きい場合、中間の1つの駅から降りて切符を買って乗車することができるので、乗客は全過程で少なくとも2枚の切符を買うことができます.L 1,L 2,L 3,C 1,C 2,C 3をあげます.次に、乗客の旅の開始駅と終点駅であるA Bの値である.次に、N,Nをその路線の合計駅数として入力し、N−1個の整数を入力し、その路線の最初の駅から2番目の駅、3番目の駅、・・・、N番目の駅までの距離を表す.入力により、乗客がAからB駅までの最小費用を出力する.入力記述:L 1 L 2 L 3 C 1 C 2 C 3 A B N a[2]a[3]......a[N]出力記述:複数組のテストデータがある可能性があり、各組のデータに対して、入力に応じて乗客のAからB駅までの最小費用を出力する.
コード:ダイナミックプランニングの問題
コード:ダイナミックプランニングの問題
// :dp( ),
//S(n)=O(n*n)
// :1. ticket
// 2. i
// 3. for i A+1 B
// for ,j A i , i j
// j
#include
using namespace std;
int L1,L2,L3,C1,C2,C3;
int A,B;//
int N;//
//
int ticket(int dis)
{
if(dis<=L1) return C1;
else if(dis<=L2) return C2;
else return C3;
}
int main()
{
while(cin>>L1>>L2>>L3>>C1>>C2>>C3)
{
cin>>A>>B>>N;
int a[N],cost[N];// i
//
for(int i=2;i<=N;i++) cin>>a[i];
a[1]=0;
cost[A]=0;// 0,A , 0
//
// A , B ,
for(int i=A+1;i<=B;i++)
{
cost[i]=cost[i-1]+ticket(a[i]-a[i-1]);
// :j A , L3 ( L3)
//
for(int j=A;jcost[j]+ticket(a[i]-a[j])&&(a[i]-a[j])<=L3)
{
cost[i]=cost[j]+ticket(a[i]-a[j]);
}
}
}
cout<