CodeForces Gym 102263
题目大意
给一个数,通过加减10x( x>=0 ) 的运算来得到这个数,求最少的运算次数。如:231 = 100 + 101 + 101 + 101 +102 + 102,结果为6。
999 = 103 - 100 ,结果为2。
题目分析
线性DP。dp[ i ][ j ],i表示数位,j为0或1,0表示这一数位采用先加后减的方式得到该数位上的数,1表示这一数位只采用加的方式得到该数位上的数。若后一个数只采用加的方式所用的运算次数则和得到前面数位的方式无关。若后一数位采用先加后减的方式则会需考虑得到前面数位的方式:若前一个数位也采用先加后减的方式,那么可以看作前面一位向后面一位 “ 借1 ”,前面一位可以省去 “ 先加 ”这一环节,同时后面的这个数位在减的时候可以少减一位(被前面的数位减去一位)。详细转换公式见代码。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<map>
using namespace std;