POJ 3373 Changing Digits(DP)
记录路径的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)的更多相关文章
- poj 3373 Changing Digits (DFS + 记忆化剪枝+鸽巢原理思想)
http://poj.org/problem?id=3373 Changing Digits Time Limit: 3000MS Memory Limit: 65536K Total Submi ...
- POJ 3373 Changing Digits 好蛋疼的DP
一開始写的高位往低位递推,发现这样有些时候保证不了第四条要求.于是又開始写高位往低位的记忆化搜索,又发现传參什么的蛋疼的要死.然后又发现高位開始的记忆化搜索就是从低位往高位的递推呀,遂过之. dp[i ...
- POJ 3373 Changing Digits
题目大意: 给出一个数n,求m,使得m的长度和n相等.能被k整除.有多个数符合条件输出与n在每位数字上改变次数最小的.改变次数同样的输出大小最小的. 共同拥有两种解法:DP解法,记忆化搜索的算法. ...
- POJ 3373 Changing Digits 记忆化搜索
这道题我是看了别人的题解才做出来的.题意和题解分析见原文http://blog.csdn.net/lyy289065406/article/details/6698787 这里写一下自己对题目的理解. ...
- POJ.3624 Charm Bracelet(DP 01背包)
POJ.3624 Charm Bracelet(DP 01背包) 题意分析 裸01背包 代码总览 #include <iostream> #include <cstdio> # ...
- POJ 2995 Brackets 区间DP
POJ 2995 Brackets 区间DP 题意 大意:给你一个字符串,询问这个字符串满足要求的有多少,()和[]都是一个匹配.需要注意的是这里的匹配规则. 解题思路 区间DP,开始自己没想到是区间 ...
- poj 3254 状压dp入门题
1.poj 3254 Corn Fields 状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...
- POJ 1260 Pearls 简单dp
1.POJ 1260 2.链接:http://poj.org/problem?id=1260 3.总结:不太懂dp,看了题解 http://www.cnblogs.com/lyy289065406/a ...
- poj 1463 Strategic game DP
题目地址:http://poj.org/problem?id=1463 题目: Strategic game Time Limit: 2000MS Memory Limit: 10000K Tot ...
随机推荐
- intellij idea 如何更改编辑器文本字体和大小
换上了intellij idea之后,第一件事就是想要改变下文字字体,因为在我这个27寸的2k分辨率的屏幕上,文字显然太小了. intellij idea字体设值分成两部分,一部分是UI部分字体字号设 ...
- centOS设置zookeeper开机自动启动
在/etc/rc.local文件中追加: # java_homeexport JAVA_HOME=/opt/java/jdk1.7.0_75# zookeeper/home/cent2014/zook ...
- Google Code Jam 2014 Round 1B Problem B
二进制数位DP,涉及到数字的按位与操作. 查看官方解题报告 #include <cstdio> #include <cstdlib> #include <cstring& ...
- PHP+七牛云存储上传图片代码片段
2014年11月14日 16:37:51 第一段代码是上传单个图片的,第二个是上传多个图片的 //上传到七牛 //单个文件 //formname: 表单名字; pre: 图片Url中显示的图片名字(也 ...
- php配置文件语法
2013年12月11日 09:21:58 ; The syntax of the file is extremely simple. Whitespace and lines ; beginning ...
- 【动态规划】盖房子(house)--未提交--已提交
问题 D: 盖房子(house) 时间限制: 1 Sec 内存限制: 64 MB提交: 27 解决: 16[提交][状态][讨论版] 题目描述 FJ最近得到了面积为n*m的一大块土地,他想在这块土 ...
- codeforces B. Xenia and Ringroad 解题报告
题目链接:http://codeforces.com/problemset/problem/339/B 题目理解不难,这句是解题的关键 In order to complete the i-th ta ...
- 【USACO】numtri
给一颗数字树,让找一条数字和最大的路径.一下子就想起刚学不久的回溯法了.照着写了个代码,调了调搞通了.在小数据的情况下是对的,但是在test 6 树有199层的时候溢出了. #include < ...
- 安卓向服务器发送List数据
第一步: 首先写一个自定义的JavaBean,以UserInfo.java为例,需要实现对象序列化的接口,因为之后输出流对象需要实现输出可序列化的对象.不这样的话,后续时发送时会报异常 package ...
- Linux内核NAPI机制分析
转自:http://blog.chinaunix.net/uid-17150-id-2824051.html 简介:NAPI 是 Linux 上采用的一种提高网络处理效率的技术,它的核心概念就是不采用 ...