初始给定一个整数n。每次可以对其做一个操作,这个操作是将n减去他其中的某一位。得到新的一个数字n’,然后继续操作,直到他变成0为止。
  比如24这个例子,24 → 20 → 18 → 10 → 9 → 0

 Input
  单组测试数据。
  第一行有一个整数n(0 ≤ n ≤ 10^12)
 Output
  输出一个整数表示使得n变成0最少的操作步数。.

  呃...今年学车中学noi摸你赛某场的T3....怎么在51nod上才5级啊(掀桌

  十连测那时候抄高分代码才过的...现在终于成功乱(背)搞(诵)出来了...

  没见过的数位DP姿势。

  结构体f[i][j][k].step、.rest:更高的位数最大值为j,将10^(i-1)-k变成<=0的最少步数step、变后的数字为-rest(1<=k<=9)

  g[i].step、.rest:将n的最低i位变成<=0的最少步数step、变后的数字为-rest

  然后转移的时候其实就是调若干次f数组,每次把当前位的数字-1。需要特判.rest等于0的情况。具体见代码吧。

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstdlib>
#include<bitset>
//#include<ctime>
#define ll long long
#define ull unsigned long long
#define ui unsigned int
#define d double
//#define ld long double
using namespace std;
const int maxn=;
struct zs{ll step;int rest;}f[][][],g[];
int s[],premx[];
//int ff[233333];ll ten[23];
int i,j,k,n,m; int ra,fh;char rx;
inline int read(){
rx=getchar(),ra=,fh=;
while((rx<''||rx>'')&&rx!='-')rx=getchar();
if(rx=='-')fh=-,rx=getchar();
while(rx>=''&&rx<='')ra=ra*+rx-,rx=getchar();return ra*fh;
}
inline int max(int a,int b){return a>b?a:b;}
/*
inline void vio(){
for(i=1;i<=9;i++)ff[i]=1;
for(i=10;i<233333;i++){
int mx=0,j=i;
while(j)mx=max(mx,j%10),j/=10;
ff[i]=ff[i-mx]+1;
// if(i<30)printf("%d %d\n",i,ff[i]);
}
}*/
int main(){
// vio();
ll n;
scanf("%lld",&n);int len=;
if(!n)return puts(""),;
for(ll x=n;x;x/=)s[++len]=x%;
for(i=/*ten[0]=*/;i<=len;i++)premx[i]=max(premx[i-],s[len-i+]);//,ten[i]=ten[i-1]*10; for(i=;i<=;i++)for(j=;j<;j++)f[][i][j]=(zs){,max(,i-(-j))};
g[]=(zs){,premx[len]-s[]}; register int digit,nrest;ll nstep;zs tmp;
for(i=;i<=len;i++){
if(i<len){
for(j=;j<=;j++)for(k=;k<;k++){
for(digit=,nstep=,nrest=k;digit>=;digit--){
tmp=f[i-][max(j,digit)][nrest],
nstep+=tmp.step,nrest=tmp.rest;
if(!nrest&&digit)nstep++,nrest=max(j,digit);
}
f[i][j][k]=(zs){nstep,nrest};
//if(!j)printf("%d %d %d (%lld,%d) ff:%d\n",i,j,k,f[i][j][k].step,f[i][j][k].rest,ff[ten[i]-k]);
}
} nstep=g[i-].step,nrest=g[i-].rest;
if(!nrest&&s[i])nstep++,nrest=premx[len-i+];
for(digit=s[i]-;digit>=;digit--){
tmp=f[i-][max(premx[len-i],digit)][nrest],
nstep+=tmp.step,nrest=tmp.rest;
if(!nrest&&digit)nstep++,nrest=max(premx[len-i],digit);
}
g[i]=(zs){nstep,nrest};
}//printf("%lld %d\n",g[len].step,ff[n]);
printf("%lld\n",g[len].step);
}

[51nod1425]减减数的更多相关文章

  1. 小巧实用的数字加减插件(jquery插件)

    2015-12-04 近期项目需要,我将插件更新了,增加了两个参数,一个参数控制文本框是否支持输入,另一个参数则是新增了一个回调函数,返回文本框内的值.另外对代码局部重构了,优化了一下封装,需要的朋友 ...

  2. jQuery数字加减插件

    jQuery数字加减插件 我们在网上购物提交订单时,在网页上一般会有一个选择数量的控件,要求买家选择购买商品的件数,开发者会把该控件做成可以通过点击实现加减等微调操作,当然也可以直接输入数字件数.本文 ...

  3. 大整数加减运算的C语言实现

    目录 大整数加减运算的C语言实现 一. 问题提出 二. 代码实现 三. 效果验证 大整数加减运算的C语言实现 标签: 大整数加减 C 一. 问题提出 培训老师给出一个题目:用C语言实现一个大整数计算器 ...

  4. C语言实现用位移运算符进行加减乘…

      最近,在百度知道上回答问题,然后看见有的人问如何用位移运算符去进行加减乘除运算,于是巩固今天就在这总结一下.   先讲讲总体思路: 加法运算:将一个整数用二进制表示,其加法运算就是:相异(^)时, ...

  5. C语言复习---获取最大公约数(辗转相除法和更相减损法)

    源自:百度百科 辗转相除法 辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法. 例如,求(,): ∵ ÷=(余319) ∴(,)=(,): ∵ ÷=(余58) ∴(,)=( ...

  6. JavaScript大位数相加减

    function arrayAdd(number, addNumber) { var numberArr = number.toString().split(''); var addNumberArr ...

  7. JavaScript 加减危机——为什么会出现这样的结果?

    在日常工作计算中,我们如履薄冰,但是 JavaScript 总能给我们这样那样的 surprise~ 0.1 + 0.2 = ? 1 - 0.9 = ? 如果小伙伴给出内心的结果: 0.1 + 0.2 ...

  8. Python_列表相减(判断长度后长的减短的)

    #定义一个方法,可进行列表相减 class V(object): def __init__(self,*value): self.value=value def __sub__(self,other) ...

  9. 笔记:如何使用postgresql做顺序扣减库存

    如何使用postgresql做顺序扣减库存 Ⅰ.废话在前面 首先这篇笔记源自于最近的一次需求,这个临时性需求是根据两份数据(库存数据以及出库数据) 算出实际库存给到业务,至于库存为什么不等于剩余库存, ...

随机推荐

  1. 垃圾回收机制GC知识再总结兼谈如何用好GC(转)

    作者:Jeff Wong 出处:http://jeffwongishandsome.cnblogs.com/ 本文版权归作者和博客园共有,欢迎围观转载.转载时请您务必在文章明显位置给出原文链接,谢谢您 ...

  2. IOS学习1——IOS应用程序的生命周期及基本架构

    一.应用程序的状态和多任务 有时系统会从app一种状态切换另一种状态来响应系统发生的事件.例如,当用户按下home键.电话打入.或其他中断发生时,当前运行的应用程序会切换状态来响应.应用程序的状态有以 ...

  3. Java零碎总结

    获取当前类运行的根目录(即classpath,如bin.classes.AppName等)的方式有: 1.Thread.currentThread().getContextClassLoader(). ...

  4. javascript + sql编写SQL客户端工具tabris

    祝大家2018新年快乐, 前不久发现了一个创意的脚本JtSQL(java编写) 开源地址为:https://github.com/noear/JtSQL JtSQL 特点:*.结合了JS.SQL.模板 ...

  5. Python Pandas 库的使用例子

    主要在jupyter notebook里面熟悉这个库的使用,它的安装方法与实现,可自行搜索. Pandas是一个优秀的数据分析工具,官网:http://pandas.pydata.org/ 相关的库使 ...

  6. tar: This does not look like a tar archive tar: Skipping to next header tar: Exiting with failure status due to previous errors

    解压一个.tar.zip文件时报错 tar -zxvf bcl2fastq2-v2---linux-x86-.zip tar: This does not look like a tar archiv ...

  7. 安装spark单机环境

    (假定已经装好的hadoop,不管你装没装好,反正我是装好了) 1 下载spark安装包 http://spark.apache.org/downloads.html 下载spark-1.6.1-bi ...

  8. Java Serializable接口(序列化)理解及自定义序列化

      1 Serializable接口 (1)简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存在数据库,内存,文件等),然后可以在适当的时候再将其状态恢复(也就是反 ...

  9. 房上的猫:StringBuffer类

    一.使用StringBuffer类 StringBuffer类位于java.lang包中,是String类的增强类 步骤:  1.声明StringBuffer对象并初始化 StringBuffer s ...

  10. Android JNI so库的开发

    build.gradle的配置 apply plugin: 'com.android.application'android { compileSdkVersion 26 buildToolsVers ...