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 ...
随机推荐
- SQL按照指定顺序对字段进行排序
SqlServer按照指定顺序对字段进行排序 问题如下,在SqlServer有一个这样的SQL查询 SELECT *FROM ProductWHERE ID IN ( 12490, 12494, 12 ...
- In-App Purchases验证
package com.demo.controller.web.app; import java.io.BufferedOutputStream; import java.io.BufferedRea ...
- 【原创】Js:日期处理(日期格式必须【yyyy-mm-dd】才能转成long的毫秒!其他的不是【年-月-日】的格式,结果会是【NaN】)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- iOS NSOperation的使用
先给出NSOpetation的官方指导https://developer.apple.com/library/ios/documentation/Cocoa/Reference/NSOperation ...
- 转载一篇关于ios copy的文章
由于原文创作时间较早,一些内容不实用了,我对其进行了加工,去掉了一部分内容,添加了一点注释. 原文连接 http://www.cnblogs.com/ydhliphonedev/archive/201 ...
- MySQL数据丢失情况分析
一.存储引擎层面丢失数据 由于在实际项目中,我们往往使用支持事务的InnoDB存储引擎.我们 ...
- Java for LeetCode 055 Jump Game
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- 【python】Python标准库defaultdict模块
来源:http://www.ynpxrz.com/n1031711c2023.aspx Python标准库中collections对集合类型的数据结构进行了很多拓展操作,这些操作在我们使用集合的时候会 ...
- fedora yum 使用代理的方法
配置yum: 编辑/etc/yum.conf添加下列一行: proxy=http://domain/user:passwd@<proxy ip>:80 <proxy ip>:代 ...
- swift复合类型
1.元组类型 (tuple) 元组就是多个元素的组合,是一个用圆括号括起来分号分隔的多个数据的一个集合体. 例如:定义一个学生变量,要求姓名 jim,年龄 19,性别 male 的元组变量为 // ...