Atcoder E - Payment(DP)

题意:
在一个国家有有 1 0 100 + 1 10^{100}+1 10100+1种货币,分别是价值为 1 , 1 0 1 , 1 0 2 , 1 0 3 . . . . . . . 1 0 100 1,10^1,10^2,10^3.......10^{100} 1,101,102,103.......10100的货币,现在你在超市买东西,你需要支付 N N N元,问你和货员在这个过程中用到的总票数最小是多少张。
思路:

从低位到高位,每一位只有两种选择,
1、支付 x x x 1 0 i 10^i 10i
2、支付1张 1 0 i + 1 10^{i+1} 10i+1,找给 10 − x 10-x 10x 1 0 i 10^i 10i的货币。
我们设 d p [ i ] [ 0 ] dp[i][0] dp[i][0]表示用第一种方法的最小票数, d p [ i ] [ 1 ] dp[i][1] dp[i][1]表示取第二种方法的最小票数。

char s[N];
ll dp[N][2];
int main(){
    s[0] = '0';
    cin >> (s + 1);
    int l = strlen(s  + 1);
    dp[l][0] = s[l] - '0';
    dp[l][1] = 10 - (s[l] - '0');
    for(int i = l - 1;i >= 0;i --){
        dp[i][0] = min(dp[i+1][0] + s[i] - '0',dp[i+1][1] + s[i]-'0' + 1);
        dp[i][1] = min(dp[i+1][0] + 10 - (s[i]-'0'),dp[i+1][1] + (10 - (s[i]-'0'+1)));
    }
    cout <<min(dp[0][0],dp[0][1]);
}

你可能感兴趣的:(动态规划)