HDU2929 Bigger is Better[DP 打印方案 !]
Bigger is Better
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1106 Accepted Submission(s): 278
Write a program to make a non-negative integer which is a multiple of m. The integer should be as big as possible.
5 6
0
Case 2: -1
题意:要用最多N根火柴摆出一个尽量大的正整数,而且这个数要能够被M整除
一开始想d[i][j]表示i根火柴模m后为j的最大数字
d[i+ms[k]][(j*+k)%m] 这样dp完了之后再处理每一位是什么,用bit[i][j]表示,n倒着枚举
具体的思想就是,大到小枚举k,找[i][j]第一个能更新到的"合法的"[ti][tj]
对于d[i][j]==mxl,bit[i][j]=10代表这一位最高下面没有了 最后打印方案,从尾开始,因为每次加是加在最后
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=,M=,INF=1e9;
int n,m;
int ms[]={,,,,,,,,,},d[N][M],bit[N][M];
void dp(){
int mxl=;
memset(d,-,sizeof(d));
d[][]=;
for(int i=;i<=n;i++)
for(int j=;j<m;j++) if(d[i][j]>=){
for(int k=;k<=;k++) if(i+ms[k]<=n){
if(d[i+ms[k]][(j*+k)%m]<d[i][j]+)
d[i+ms[k]][(j*+k)%m]=d[i][j]+;
//if(i==0&&j==0) printf("o %d %d %d\n",i+ms[k],(j*10+k)%m,d[i+ms[k]][(j*10+k)%m]);
}
if(j==) mxl=max(mxl,d[i][j]);//printf("d %d %d %d\n",i,j,d[i][j]);
} memset(bit,-,sizeof(bit));
for(int i=n;i>=;i--)
for(int j=;j<m;j++) if(d[i][j]>=){
if(d[i][j]==mxl&&j==) {bit[i][j]=;continue;}
for(int k=;k>=;k--) if(i+ms[k]<=n){
int ti=i+ms[k],tj=(j*+k)%m;
if(d[ti][tj]==d[i][j]+&&bit[ti][tj]>=) {bit[i][j]=k;break;}
// if(i==0&&j==0) printf("obit %d %d %d %d\n",ti,tj,d[ti][tj],bit[ti][tj]);
}
}
//printf("hi %d %d %d\n",mxl,d[0][0],bit[0][0]);
if(mxl>){
int i=,j=,ti,tj;
while(mxl-->){
ti=i+ms[bit[i][j]];
tj=(j*+bit[i][j])%m;
printf("%d",bit[i][j]);
i=ti;j=tj;
}
}else printf("-1");
printf("\n");
}
int main(){int cas=;
while(cin>>n){ if(n==) break;cin>>m;
printf("Case %d: ",++cas);
dp();
}
}
HDU2929 Bigger is Better[DP 打印方案 !]的更多相关文章
- CF10D-LCIS题解--线性DP+打印方案
题目链接: https://www.luogu.org/problemnew/show/CF10D 方法一 分析 \(LCS\)和\(LIS\)已经成烂大街的知识了,可是当这两个合并起来成为\(LCI ...
- BestCoder Round #87 1002 Square Distance[DP 打印方案]
Square Distance Accepts: 73 Submissions: 598 Time Limit: 4000/2000 MS (Java/Others) Memory Limit ...
- HDU 2296 Ring [AC自动机 DP 打印方案]
Ring Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissio ...
- UVA 10564 Paths through the Hourglass[DP 打印]
UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...
- POJ 2125 Destroying The Graph [最小割 打印方案]
Destroying The Graph Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8311 Accepted: 2 ...
- 【题解】POJ1934 Trip (DP+记录方案)
[题解]POJ1934 Trip (DP+记录方案) 题意: 传送门 刚开始我是这么设状态的(谁叫我DP没学好) \(dp(i,j)\)表示钦定选择\(i\)和\(j\)的LCS,然而你会发现这样钦定 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- hdu2929 Bigger Is Better
题意 给出n根木棍,要你拼一个最大的数,并且这个数是m的倍数. 题解 显然越长的数越大.设\(dp[i][j]\)表示用i根木棍并且\(mod m = j\)的最大长度. 我们很容易想出dp方程,再用 ...
- lightoj1064 【DP求方案】
题意: n个相同的骰子,问你掷出>=x点数的可能性: 思路: dp[i][j]代表前 i 个骰子掷出 j 点数的方案数; 然后Σdp[n][x]-dp[n][6*n]就好了 卧槽,一开始想的是拆 ...
随机推荐
- 【html5】Web存储_locaStorage对象的应用
Web存储 html5可以在本地存储用户浏览的数据,数据的存储原理是以 键/值 存储的 存储对象分类 localStorage:没有时间限制的数据存储 sessionStorage:针对一个会话的数据 ...
- js时钟&倒计时
<!DOCTYPE HTML> <html><head><meta charset=UTF-8><title>recursion</t ...
- 关于sharepoint2013的SPUtility.GetGenericSetupPath()方法过期解决办法
有个时候需要读取layouts下的xml文件,因此需要知道路径,以前在SP2010用的SPUtility.GetGenericSetupPath()方法获取.现在SP2013提示过期否决 看2个结构分 ...
- SharePoint 部署解决方案Feature ID冲突
中文报错: 部署步骤“添加解决方案”中出现错误: 已在此服务器场中安装 ID 为 735efe4e-8b50-4310-b588-c6ae2ba0759f 的功能.请使用强制属性显式地重新安装此功能. ...
- [Android]使用Gradle提交自己开源Android库到Maven中心库
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4388175.html 此文针对开源爱好者. 如果你想让别人使用 ...
- 发布一个java Servlet (静态发布)
Servlet 是sun开发的动态web资源 的技术 让 Servlet 能响应用户请求,必须将 Servlet 配置在 Web 应用中 如何将Servlet用Tomcat发布出去: 编译你的.jav ...
- Java中的经典算法之选择排序(SelectionSort)
Java中的经典算法之选择排序(SelectionSort) 神话丿小王子的博客主页 a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟 ...
- OC 初识NSString,self关键字,继承,成员变量的可见性,description方法
OC 初识NSString,self关键字,继承,成员变量的可见性,description方法 初识 NSString: char * string = "旭宝爱吃鱼"; 常量字符 ...
- Java基础知识学习(六)
多线程 先了解线程的概念 多线程需要注意的地方 优先级.线程同步.消息传递.数据共享.死锁等 Java线程类 Thread,实现接口 Runnable Thread常用方法 getName 获得线程名 ...
- 面试问题-使用Java线程做数学运算
这是一个展示如何使用join()方法的例子. 问题: 使用Java多线程计算表达式1*2/(1+2)的值. 解决方案: 使用一个线程做加法运算,另一个线程做乘法运算,还有一个主线程main做除法运算. ...