首页 > 其他 > 详细

Gym 102263 ArabellaCPC 2019 J - Thanos Power (DP,数学)

时间:2020-07-01 19:44:29      阅读:63      评论:0      收藏:0      [点我收藏+]

技术分享图片

  • 题意:有一个整数\(n\),每次可以对加\(10^x\)或减\(10^x\),问最少操作多少次能得到\(n\).

  • 题解:对于某一位上的数,我们可以从\(0\)加几次得到,或者从前一位减几次得到.所以对于每一位,我们都要求得一个最优解,所以用dp来写.

    dp数组的一维表示当前的位置,二维表示是用第一种情况还是第二种情况.

    而对于第二种情况,我们还要判断上一个位置用的是哪种,如果上一个位置用的是第一种情况,那么状态就应该是\(dp[i-1][0]+1\)(上一位要多补一个1),反之,状态应该是\(dp[i-1][1]-1\)(上一位要少减一个1,补给当前的位置).然后每次维护最优解即可.

  • 代码:

    string s;
    int dp[N][2];
    
    int main() {
        ios::sync_with_stdio(false);cin.tie(0);
      	cin>>s;
      	dp[0][0]=s[0]-‘0‘;
      	dp[0][1]=10-(s[0]-‘0‘)+1;
      	int len=s.size();
      	for(int i=1;i<len;++i){
      		dp[i][0]=s[i]-‘0‘+min(dp[i-1][0],dp[i-1][1]);
      		dp[i][1]=10-(s[i]-‘0‘)+min(dp[i-1][0]+1,dp[i-1][1]-1);
      	}
    
        cout<<min(dp[len-1][0],dp[len-1][1])<<endl;;
    
        return 0;
    }
    

Gym 102263 ArabellaCPC 2019 J - Thanos Power (DP,数学)

原文:https://www.cnblogs.com/lr599909928/p/13220781.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!