题目链接

记录路径的DP,看的别人的思路。自己写的也不好,时间居然2000+,中间的取余可以打个表,优化一下。

写的各种错,导致wa很多次,写了一下午,自己构造数据,终于发现了最后一个bug。

dp[i][j]表示前i位取余得到j,需要最少改变多少位。

这样可以得到最少改变多少位了,但是,还要保证,最小。学习别人的题解,开一个标记数组,先从后倒回来,把这些可以达到最小的路径都记录下来。

然后再从头找最小的那一条路径。这样就能保证,最小了。

 #include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define INF 100000000
int dp[][];
bool o[][];
int que[];
int main()
{
int i,j,k,n,m,t,z,pos;
char str[];
while(scanf("%s%d",str,&m)!=EOF)
{
n = strlen(str);
if(n == )
{
if((str[]-'')%m == )
printf("%d\n",str[]-'');
else
printf("0\n");
continue;
}
for(i = ; i < n; i ++)
{
for(j = ; j < m; j ++)
{
dp[i][j] = INF;
o[i][j] = ;
}
}
for(i = ; i < ; i ++)
{
t = i%m;
if(i == str[]-'')
z = ;
else
z = ;
dp[][t] = min(dp[][t],z);
}
for(i = ; i < n-; i ++)
{
for(j = ; j < m; j ++)
{
if(dp[i][j] == INF) continue;
for(k = ; k < ; k ++)
{
if(k == str[i+]-'')
z = ;
else
z = ;
dp[i+][(j*+k)%m] = min(dp[i+][(j*+k)%m],dp[i][j]+z);
}
}
}
o[n-][] = ;
for(i = n-; i >= ; i --)
{
for(j = ; j < m; j ++)
{
if(dp[i][j] == INF) continue;
for(k = ; k < ; k ++)
{
if(k == str[i+]-'')
z = ;
else
z = ;
if(dp[i+][(j*+k)%m] == dp[i][j]+z&&o[i+][(j*+k)%m])
{
o[i][j] = ;
}
}
}
}
for(i = ; i < ; i ++)
{
t = i%m;
if(i == str[]-'')
z = ;
else
z = ;
if(o[][t]&&dp[][t] == z)
{
printf("%d",i);
pos = t;
break;
}
}
for(i = ;i < n;i ++)
{
for(j = ;j < ;j ++)
{
if(j == str[i]-'')
z = ;
else
z = ;
if(o[i][(pos*+j)%m]&&dp[i][(pos*+j)%m] == dp[i-][pos]+z)
{
printf("%d",j);
pos = (pos*+j)%m;
break;
}
}
}
printf("\n");
}
return ;
}

POJ 3373 Changing Digits(DP)的更多相关文章

  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[i ...

  3. POJ 3373 Changing Digits

    题目大意: 给出一个数n,求m,使得m的长度和n相等.能被k整除.有多个数符合条件输出与n在每位数字上改变次数最小的.改变次数同样的输出大小最小的.  共同拥有两种解法:DP解法,记忆化搜索的算法. ...

  4. POJ 3373 Changing Digits 记忆化搜索

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

  5. POJ.3624 Charm Bracelet(DP 01背包)

    POJ.3624 Charm Bracelet(DP 01背包) 题意分析 裸01背包 代码总览 #include <iostream> #include <cstdio> # ...

  6. POJ 2995 Brackets 区间DP

    POJ 2995 Brackets 区间DP 题意 大意:给你一个字符串,询问这个字符串满足要求的有多少,()和[]都是一个匹配.需要注意的是这里的匹配规则. 解题思路 区间DP,开始自己没想到是区间 ...

  7. poj 3254 状压dp入门题

    1.poj 3254  Corn Fields    状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...

  8. POJ 1260 Pearls 简单dp

    1.POJ 1260 2.链接:http://poj.org/problem?id=1260 3.总结:不太懂dp,看了题解 http://www.cnblogs.com/lyy289065406/a ...

  9. poj 1463 Strategic game DP

    题目地址:http://poj.org/problem?id=1463 题目: Strategic game Time Limit: 2000MS   Memory Limit: 10000K Tot ...

随机推荐

  1. JSoup——用Java解析html网页内容

    当需要从网页上获取信息时,需要解析html页面.筛选指定标签,并获取其值是必不可少的操作,解析html页面这方面的利器,Python有BeautifulSoup,Java一直没有好的工具,之前的Htm ...

  2. Jquery获取数据并生成下拉菜单

    <script type="text/javascript"> $(document).ready(function() { GetByJquery(); $(&quo ...

  3. 【云计算】Dockerfile、镜像、容器快速入门

    Dockerfile.镜像.容器快速入门 1.1.Dockerfile书写示例 Dockerfile可以用来生成Docker镜像,它明确的定义了Image的生成过程.虽然直接修改容器也可以提交生成镜像 ...

  4. 【云计算】Netflix 开源持续交付平台 Spinnaker

    oschina        发布于: 2015年11月19日 (0评)          分享到:    收藏 +1 CDS首都在线全球云主机.全球私有网络,开工送礼,免费试用! »   日前,Ne ...

  5. windows和linux下mysql的重启命令

    在 Windows 下: 开始->运行->cmd启动:net start mysql停止:net stop mysql 无重启,必须先停止再启动!!! 在LINUX 下: 启动:/etc/ ...

  6. iOS 用CALayer实现动画

    与动画有关的几个类的继承关系 涉及到动画的类主要有6个,看一下它们的基本用途: 1. CAAnimation  动画基类 2. CAAnimationGroup 组合多个动画 3. CAPropert ...

  7. Eclipse中android工程C++文件中出现的莫名其妙的错误

    大多数是std库相关的问题,例如 vector<int> v; v.push_back(23);//这句语法是没有错误的,但是每次执行Run As的时候就会报错 尝试1:在工程名右键-Cl ...

  8. document.createElement

    document.createElement()的用法 document.createElement()是在对象中创建一个对象,要与appendChild() 或 insertBefore()方法联合 ...

  9. Emblog 备忘

    emblog换后台:(如admin-->xx) 1.xx目录下的globals.php打开找到替换admin(1) 2.www目录下的t\index.php 中找到替换admin(1) 3.ww ...

  10. stm32——Flash读写

    stm32——Flash读写 一.Flash简介 通过对stm32内部的flash的读写可以实现对stm32的编程操作. stm32的内置可编程Flash在许多场合具有十分重要的意义.如其支持ICP( ...