1. 程式人生 > >RQNOJ 169 最小乘車費用:水dp

RQNOJ 169 最小乘車費用:水dp

oid rri ble bound other size family ring href

題目鏈接:https://www.rqnoj.cn/problem/169

題意:

  給出行駛1~10公裏的費用(所有車一樣),可以倒車,問行駛n公裏的最小費用。

題解:

  大水題。。。 (=′ω`=)

  表示狀態:

    dp[i] = min cost

    i:行駛了i公裏

  找出答案:

    ans = dp[n]

  如何轉移:

    now: dp[i]

    dp[i+j] = min dp[i] + c[j]

    枚舉倒車行駛j公裏

  邊界條件:

    dp[0] = 0

    others = -1

AC Code:

 1 // state expression:
2 // dp[i] = min cost 3 // i: drove i km 4 // 5 // find the answer: 6 // ans = dp[n] 7 // 8 // transferring: 9 // now: dp[i] 10 // dp[i+j] = min dp[i] + c[j] 11 // 12 // boundary: 13 // dp[0] = 0 14 // others = -1 15 #include <iostream> 16 #include <stdio.h> 17 #include <string.h> 18 #define MAX_N 105 19
#define MAX_L 15 20 21 using namespace std; 22 23 int n; 24 int c[MAX_L]; 25 int dp[MAX_N]; 26 27 void read() 28 { 29 for(int i=1;i<=10;i++) 30 { 31 cin>>c[i]; 32 } 33 cin>>n; 34 } 35 36 void solve() 37 { 38 memset(dp,-1,sizeof(dp)); 39 dp[0]=0; 40 for
(int i=0;i<n;i++) 41 { 42 if(dp[i]!=-1) 43 { 44 for(int j=1;j<=10;j++) 45 { 46 if(dp[i+j]==-1 || dp[i+j]>dp[i]+c[j]) 47 { 48 dp[i+j]=dp[i]+c[j]; 49 } 50 } 51 } 52 } 53 } 54 55 void print() 56 { 57 cout<<dp[n]<<endl; 58 } 59 60 int main() 61 { 62 read(); 63 solve(); 64 print(); 65 }

RQNOJ 169 最小乘車費用:水dp