初始给定一个整数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. Gulp 的简单使用(原创)

    1.安装nodejs 安装省略 npm的全称是Node Package Manager,是随同NodeJS一起安装的包管理和分发工具,它很方便让JavaScript开发者下载.安装.上传以及管理已经安 ...

  2. qml demo分析(externaldraganddrop-拖拽)

    一.效果展示 客户端程序拖拽是一个很常见的需求,对于QWidget程序来说,需要重写如图1这么几个方法,通过重写这几个方法的逻辑,我们就可以控制鼠标拖拽的逻辑,糟糕的是QDrag执行exec后是一个阻 ...

  3. Git 企业开发者教程

      为什么要写这样一个面向企业开发者的Git教程?这个问题也困扰我自己很久.其实我使用git的时间也不短了,但是就和正在阅读本文的每一位一样,常用的基本就是那么几个(git clone, git pu ...

  4. 树链剖分X2

    1.ZJOI树的统计 板子题 因为初始化没打改了几个小时 改到双腿软着出的机房(身体素质感人 #include<iostream> #include<cstdio> #incl ...

  5. CentOS7 nginx安装

    1 nginx安装环境 nginx是C语言开发,建议在linux上运行,本教程使用Centos6.5作为安装环境. n gcc 安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没 ...

  6. lesson - 5 Linux用户和组管理

    1. /etc/passwd由 : 分隔成7个字段(1) 用户名 规则:大小写字母.数字.减号(不能出现在首位).点以及下划线,其他字符不合法 (2) x 放密码,安全起见放到 /etc/shadow ...

  7. Yum database disk image is malformed

    使用 yum update 时使用Ctrl+C 后,再用yum 安装其他软件的时候收到:Yum database disk image is malformedyum clean dbcache 清除 ...

  8. Web API系列之一 Rest简介

    1.REST:Representational State Transfer表征状态转移,是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格.REST设计风格有如下几点: ...

  9. 【bird-java】bird-java概述

    bird-java是以dubbo为基础的分布式服务框架,专注于业务开发,提炼后台应用中的经典业务场景,大幅减少开发编码量. 技术选型 基础框架:spring 服务调度:dubbo web层:sprin ...

  10. 【原创】java NIO selector 学习笔记 一

    能力有限,仅仅是自己看源码的一些笔记. 主要介绍 可选通道 和 选择器 选择键(SelectableChannel  和 Selector SelectionKey) 选择器(Selector) 选择 ...