一道题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 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大 ...
随机推荐
- DOS下更改编码方式
使用CHCP命令,CHCP是Change Code Page的缩写. 936 简体中文GBK 437 美国英语 65001 UTF编码 如:chcp 65001则将dos窗口中的字符编码改为UTF编码 ...
- Windows API 的数据类型与 Delphi 数据类型对照表
Windows 数据类型 Delphi 数据类型 描述 LPSTR PAnsiChar 字符串指针 LPCSTR PAnsiChar 字符串指针 DWORD LongWord 整数 BOOL Long ...
- Oracle 11g 执行计划管理1
1. 执行计划管理的工作原理 1.1控制执行计划的稳定性 11g之前,可以使用存储大纲(stored outline)和SQL Profile来固定某条SQL语句的执行计划,防止由于执行计划发生变化而 ...
- Python脚本控制的WebDriver 常用操作 <一> 启动浏览器
由于本人的学习定位是基于Selenium+WebDriver+Python+FireFox+Eclipse+Pydev, 所以我的笔记也只和这方面相关. 我打算先学习基于Python脚本WebDriv ...
- NFC Forum : Frequently Asked Questions (NFC 论坛:FAQ)
NFC for Business What is the NFC Forum? The NFC Forum is a not-for-profit industry organization whos ...
- C#实现大数字的运算
1.添加引用:System.Numerics.dll 2.添加命名空间:using System.Numerics; 3.实例: 3.1判断一个数字是不是质数 static void Main(str ...
- ios中怎么样判断路径最后的后缀名称
使用hasSuffix属性即可 例如 [photo.thumbnail_pic.lowercaseString hasSuffix:@"gif"]
- 基于xmpp openfire smack开发之Android客户端开发[3]
在上两篇文章中,我们依次介绍openfire部署以及smack常用API的使用,这一节中我们着力介绍如何基于asmack开发一个Android的客户端,本篇的重点在实践,讲解和原理环节,大家可以参考前 ...
- 条款9:不要在构造和析构过程中调用virtual函数
如下是一个股票交易的例子: class Transaction // 交易的基类 { public: Transaction(); ; // 用于记录交易日志 }; Transaction::Tran ...
- P3408: [Usaco2009 Oct]Heat Wave 热浪
水题,裸的最短路. ; type link=^node; node=record t,d:longint; f:link; end; var n,m,s,i,j,u,v,w,max:longint; ...