题目大意:

给出一个数n,求m,使得m的长度和n相等。能被k整除。有多个数符合条件输出与n在每位数字上改变次数最小的。改变次数同样的输出大小最小的。 

共同拥有两种解法:DP解法,记忆化搜索的算法。

以后会更新记忆化搜索。

1、DP解法:

解题思路:

DP[i][j]表示数n的前i位除以k余j最小改变几位。

DP[len][0]就表示数n被k整除最小改变几位。

依据这个关系从后向前遍历DP数组能够找出全部满足条件的数的路径。

再依据关系从前往后输出。





以下是代码:

#include <stdio.h>
#include <string.h>
int dp[110][10005];
bool vis[110][10005];
int mod;
int min(int a,int b)
{
if(a>b)a=b;
return a;
}
int main()
{
char s[105];
while(scanf("%s %d",s,&mod)!=EOF)
{
memset(dp,0x3f3f,sizeof(dp));
memset(vis,false,sizeof(vis));
int len=strlen(s);
/******特判部分↓*********/
if(mod==1)
{
puts(s);
continue;
}
if(len==1)
{
if((s[0]-'0')%mod==0)
{
puts(s);
}
else printf("%d\n",mod);
continue;
}
/****DP部分 ↓******/
for(int i=1; i<10; i++)
{
if(i==s[0]-'0')
{
dp[1][i%mod]=0;
}
else
{
dp[1][i%mod]=min(dp[1][i%mod],1);
}
}
for(int i=1; i<len; i++)
{
for(int j=0; j<mod; j++)
{
if(dp[i][j]!=dp[104][0])
{
for(int k=0; k<10; k++)
{
if(k==s[i]-'0')
{
if(dp[i+1][(j*10+k)%mod]>dp[i][j])
{
dp[i+1][(j*10+k)%mod]=dp[i][j];
}
}
else
{
if(dp[i+1][(j*10+k)%mod]>dp[i][j]+1)
{
dp[i+1][(j*10+k)%mod]=dp[i][j]+1;
}
}
}
}
}
}
/*****寻找路径部分 ↓******/
vis[len][0]=true;
for(int i=len-1; i>0; i--)
{
for(int j=0; j<mod; j++)
{
if(dp[i][j]!=dp[104][0])
{
for(int k=0; k<10; k++)
{
if(vis[i+1][(j*10+k)%mod]&&((dp[i][j]==dp[i+1][(j*10+k)%mod]&&k==s[i]-'0')||(k!=s[i]-'0'&&dp[i][j]+1==dp[i+1][(j*10+k)%mod])))
{
vis[i][j]=true;
break;
}
}
}
}
}
/*****输出部分 ↓*******/
int p=1,x=1;
for(; p<10; p++)
{
if(vis[1][p%mod])
{
printf("%d",p);
break;
}
}
while(x<len)
{
for(int k=0; k<10; k++)
{
if(vis[x+1][(p*10+k)%mod]&&((s[x]-'0'==k&&dp[x][p]==dp[x+1][(p*10+k)%mod])||(s[x]-'0'!=k&&dp[x][p]+1==dp[x+1][(p*10+k)%mod])))
{
printf("%d",k);
p=p*10+k;
p%=mod;
x++;
break;
}
}
}
puts("");
}
return 0;
}

POJ 3373 Changing Digits的更多相关文章

  1. poj 3373 Changing Digits (DFS + 记忆化剪枝+鸽巢原理思想)

    http://poj.org/problem?id=3373 Changing Digits Time Limit: 3000MS   Memory Limit: 65536K Total Submi ...

  2. POJ 3373 Changing Digits(DP)

    题目链接 记录路径的DP,看的别人的思路.自己写的也不好,时间居然2000+,中间的取余可以打个表,优化一下. 写的各种错,导致wa很多次,写了一下午,自己构造数据,终于发现了最后一个bug. dp[ ...

  3. POJ 3373 Changing Digits 好蛋疼的DP

    一開始写的高位往低位递推,发现这样有些时候保证不了第四条要求.于是又開始写高位往低位的记忆化搜索,又发现传參什么的蛋疼的要死.然后又发现高位開始的记忆化搜索就是从低位往高位的递推呀,遂过之. dp[i ...

  4. POJ 3373 Changing Digits 记忆化搜索

    这道题我是看了别人的题解才做出来的.题意和题解分析见原文http://blog.csdn.net/lyy289065406/article/details/6698787 这里写一下自己对题目的理解. ...

  5. poj 2720 Last Digits

    Last Digits Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2233   Accepted: 474 Descri ...

  6. poj练习题的方法

    poj1010--邮票问题 DFSpoj1011--Sticks dfs + 剪枝poj1020--拼蛋糕poj1054--The Troublesome Frogpoj1062--昂贵的聘礼poj1 ...

  7. poj很好很有层次感(转)

    OJ上的一些水题(可用来练手和增加自信) (POJ 3299,POJ 2159,POJ 2739,POJ 1083,POJ 2262,POJ 1503,POJ 3006,POJ 2255,POJ 30 ...

  8. POJ题目分类推荐 (很好很有层次感)

    著名题单,最初来源不详.直接来源:http://blog.csdn.net/a1dark/article/details/11714009 OJ上的一些水题(可用来练手和增加自信) (POJ 3299 ...

  9. sed武功心法(info sed翻译+注解)

    本文中的提到GNU扩展时,表示该功能是GNU为sed提供的(即GNU版本的sed才有该功能),一般此时都会说明:如果要写具有可移植性的脚本,应尽量避免在脚本中使用该选项. 本文中的正则表达式几乎和gr ...

随机推荐

  1. redis学习(三)五种数据结构

    Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). 1.string string类型是Redis最基 ...

  2. jQuery初级

    一.简介 定义 jQuery创始人是美国John Resig,是优秀的Javascript框架: jQuery是一个轻量级.快速简洁的javaScript库.源码戳这 jQuery对象 jQuery产 ...

  3. Chrome 浏览器访问 Google 学术出现问题 “but your computer or network may be sending automated queries. ”

    问题: Chrome 浏览器访问 Google 学术出现如下的问题 : ... but your computer or network may be sending automated querie ...

  4. 简单实现UIlabel可复制功能

    作者 Sunshine_tt 关注 在我们日常的开发中经常会遇到一些小需求,比如需要长按控件来拷贝控件中得内容.我们知道在iOS中有三个控件自身是支持拷贝,粘贴的,如:UITextField,UITe ...

  5. 远程映射错误 “发生系统错误 1312 指定的登录会话不存在。可能已被终止 IIS 访问 远程共享目录”

    最近和其他公司做接口,需要将数据上传给对方. 我们发送程序部署在前置机上,文件在内网数据中.需要映射到文件服务器后上传数据.本机vs开发是可以映射成功,但是部署到远程的IIS中,就不能成功. 报错:  ...

  6. Cover

    [题目描述] 有 N 个时间段,某个时间段可能包含其它时间段. 请找出能包含其它时间段最多的那个段,并计算出它包括的其它时间段有多少? [数据范围] 1 <= N <= 25,000 1  ...

  7. 使用T4模板创建一个例子

    1.创建项目,添加新项,名称处填写Messages.tt,如下图: 添加后,Messages.tt文件内容如下: <#@ template debug="false" hos ...

  8. 【Visual Studio】解决错误 fatal error C1010: unexpected end of file while looking for precompiled head(转)

    原文转自 http://blog.csdn.net/liuqiyao_01/article/details/38867145 在编译VS时候,出现fatal error C1010: unexpect ...

  9. 关于platform_device和platform_driver的匹配【转】

    转自:http://blog.csdn.net/dfysy/article/details/5959451 版权声明:本文为博主原创文章,未经博主允许不得转载. 说句老实话,我不太喜欢现在Linux ...

  10. 把握linux内核设计思想系列【转】

    转自:http://blog.csdn.net/shallnet/article/details/47734053 版权声明:本文为博主原创文章,未经博主允许不得转载.如果您觉得文章对您有用,请点击文 ...