题目大意:给一个101e5以内的数字,你要通过两种操作凑出来;执行两种操作:一种是加上10x,一种是减去10x.
这个题很容易联想到01背包,每一步都可以选择通过10-k+1做法或者是直接k的做法,简而言之,9可以通过先加上10,再减去1来实现。
但是这是每一步影响都是下一步,我们可以在每一步都用两个数值表示上一位是第一个做法实现还是第二个做法实现,这样就可以完美优化了:
做法如下:
for(int time=0;time<len;time++)
{//(有用点个赞呗)
int x=a,y=b;
a=min(x,y)+all[time]-'0';//直接
if(time==0)b=x+11+'0'-all[time];
else b=min(x+11+'0'-all[time],y+9+'0'-all[time]);//两种的+10再减。
ans=min(a,b);
}
这里其实还有个问题,如果是第一种做法实现,即先加10,再慢慢减;会出现一种情况,就是前一个为也是减出来的,后面一位也是减出来的。后一位需要一个10,前一位正好不用减这个10,留给后面用就行了,这样前面步数-1,后面因为有前面留出来的10,步数也-1,也就是说:
b=min(x+11+‘0’-all[time],y+9+‘0’-all[time]);
这个代码就实现了前一位如果是减操作的话,就会导致少了两步。
(有用点个赞呗)