-
题意:有一个整数\(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; }
相关文章: