一道题DP
Problem Description
小明每经过一个房间,都要受到一定的伤害(伤害都大于0),而且这个伤害可不是累加的哦,是累乘的,因此当他走出地牢的时候,他受到的伤害会非常大。但是小明有一个终极技能,能把受到的伤害X转变为金币,转化如下。
int val(type x) {
int ret = 0;
while(x % 12 == 0) {
x /= 12;
ret++;
}
return ret;
}
请问小明最多能得到多少金币?
Input
Output
Sample Input
3
12 1 24
6 3 4
4 4 16
0
Sample Output
Case #1: 3
解析:
12可以分为2*2*3;
那么答案就是统计min(2的个数/2,3的个数)的最大值;
如果直接记录2的个数,3的个数为状态的话,50*50*乘积中2的幂次*3的幂次,内存不够。
于是想到只将3的幂次作为一种状态,然后记录沿途能达到的2的个数。
状态方程 F[I][J][K]表示能够有2因子的个数,没有就为-1;
Temp=max(F[I-1][J][K],F[I]J-1][K]);
F[I][J][K+MP[I][J].Y]=TEMP+MP[I][J].X;
注意边界;
具体看代码了;
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#define INF 999999999
#define N 100000
using namespace std; struct node
{
int x,y;
}mp[][]; int dp[][][]; int main()
{
int t=;
int n;
while (scanf("%d",&n)!=EOF&&n){
printf("Case #%d: ",++t);
memset(mp,,sizeof(mp));
memset(dp,-,sizeof(dp));//初始化为-1, for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
{
int xx,yy;
scanf("%d",&xx);
yy=xx;
while (yy%==)//记录元素是2的多少次方
{
mp[i][j].x++;
yy/=;
}
while (xx%==)记录元素是3的多少次放
{
mp[i][j].y++;
xx/=;
}
}
dp[][][]=;
for (int i=;i<=n;i++) dp[][i][]=,dp[i][][]=;//边界 for (int i=;i<=n;i++)//状态转移
for (int j=;j<=n;j++)
for (int k=;k<=;k++)//1200是自己随便写的一个状态,可能实际没有这么多
{
int temp=max(dp[i-][j][k],dp[i][j-][k]);//考虑DP[I-1][J][K],DP[I][J-1][K]都可能为-1
if (temp>-)
dp[i][j][k+mp[i][j].y]=mp[i][j].x+temp;
} int ans=;
for (int i=;i<=;i++)
ans=max(ans,min(dp[n][n][i]/,i));
printf("%d\n",ans);
}
return ;
}
一道题DP的更多相关文章
- 动态规划(DP计数):HDU 5116 Everlasting L
Matt loves letter L.A point set P is (a, b)-L if and only if there exists x, y satisfying:P = {(x, y ...
- Contest20140906 ProblemA dp+线段树优化
Problem A 内存限制 256MB 时间限制 5S 程序文件名 A.pas/A.c/A.cpp 输入文件 A.in 输出文件 A.out 你有一片荒地,为了方便讨论,我们将这片荒地看成一条直线, ...
- cf1110d 线性dp
很精练的一道题 /* dp[i][j][k]表示值i作为最大值结束的边剩k条,i-1剩下j条的情况的结果 dp[i][k][l]是由dp[i-1][j][k]的j决定的,因为k+l是被留下给后面用的, ...
- 2018.09.25 bzoj3572: [Hnoi2014]世界树(虚树+树形dp)
传送门 虚树入门题? 好难啊. 在学习别人的写法之后终于过了. 这道题dp方程很好想. 主要是不好写. 简要说说思路吧. 显然最优值只能够从子树和父亲转移过来. 于是我们先dfs一遍用儿子更新父亲,然 ...
- LOJ #6037.「雅礼集训 2017 Day4」猜数列 状压dp
这个题的搜索可以打到48分…… #include <cstdio> #include <cstring> #include <algorithm> ; bool m ...
- HDU - 2571 命运 DP倍数跳跃处理
命运 穿过幽谷意味着离大魔王lemon已经无限接近了! 可谁能想到,yifenfei在斩杀了一些虾兵蟹将后,却再次面临命运大迷宫的考验,这是魔王lemon设下的又一个机关.要知道,不论何人,若在迷宫中 ...
- 百度之星资格赛 1003 度度熊与邪恶大魔王(二维dp)
分析 挺好的一道题 dp[i][j]表示打败i颗血j防御力的怪兽需要的最少宝石数 然后就好了,复杂度\(O(n+m*1000*10)\) #include <bits/stdc++.h> ...
- DP斜率优化总结
目录 DP斜率优化总结 任务安排1 任务计划2 任务安排3 百日旅行 DP斜率优化总结 任务安排1 首先引入一道题,先\(O(N^2)\)做法:分别预处理出\(T_i,C_i\)前缀和\(t[i],c ...
- P1095 守望者的逃离——DP?贪心?
https://www.luogu.org/problem/P1095 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大 ...
随机推荐
- Jquery权威指南
1.Radio <input id="Radio1" name="rdoSex" type="radio" value="男 ...
- ios中怎么样转行大小写
转换大小写:lowercaseString(小写) uppercaseString(大写)
- IOS 其他 - 如何让 app 支持32位和64位
让App支持32-bit和64-bit基本步骤 1.确保Xcode版本号>=5.0.1 2.更新project settings, minimum deployment target >= ...
- inout用法浅析
inout io_data; reg out_data; reg io_link; assign io_data=io_link? out_data:'bz; //当IO_data作为输入口使用时,一 ...
- iOS 进阶 第十四天(0416)
0416 注意调用关系,如下图: 就是initWithCoder:.initWithFrame.setup方法三元组
- 读Windows编程
1.Windows是一个消息驱动系统.它通过把消息投入应用程序消息队列中或者把消息发送给合适的窗口消息处理程序,将发生的各种事件通知给应用程序 2.尽管一个动态链接库模块可能有其它扩展名(如.EXE或 ...
- KinectStudio使用教程
在Kinect SDK 2.0安装结束之后,会有一个KinectStudio的调试工具,他可以将动作记录下,以后即便脱离了Kinect传感器也可以愉快的调试了.现在我们来看看如何使用 首先打开Kine ...
- [shell基础]——sort命令
sort命令 sort是按照ASCII码升序输出,且是从首字符依次向后比较的 常见选项 -c 测试文件是否已经被排序 -r 逆向排序 -n 按照数字数值大小排序 -t 指定分割 ...
- 代码实现Autolayout
代码实现Autolayout的步骤 利用NSLayoutConstraint类创建具体的约束对象 添加约束对象到相应的view上 - (void)addConstraint:(NSLayoutCons ...
- spring mvc官网下最新jar搭建框架-静态资源访问处理-注解-自动扫描
1.从官网下载spring相关jar http://spring.io/projects 点击SPRING FRAMEWORK