题目链接: http://codeforces.com/problemset/problem/799/D

题意: 给出两个矩阵边长 a, b, 和 w, h, 以及一个 c 数组, 可选择 c 数组中任意数字乘上w 或 h. 数组中每个数字最多只能用一次. 求最少选择多少个数字可使得边长为 a, b 的矩阵能放到变化后的矩阵中.

思路: log2(1e5) = 17, 即最多需要对一条边乘17个数字, 要是完全暴力的话需要 2^34 的时间复杂度, 显然不行.

本题 dp 可解, 先给 c 降序排列, 用 dp[i][j] = k 表示到第 i 个元素, 其中一条边为 j 时另外一条边最大为 k.

那么动态转移方程式为: dp[i][j] = max(dp[i - 1][j / c[i]], dp[i - 1][j] * c[i])

但是用普通 dp 的话会有两个问题, 其一是 j / c[i] 整除问题, 这个可以先判断一下能否整除解决. 其二是 w * c[i] 非常大, 如:

100000 100000 99999 99999 2
30000 30000

设定  0 < j <= 1e5 显然不够, 要是 j 太大则会 tle. 虽然不一定没有解决的方法, 但是显然可以不用这么麻烦, 将其改成记忆化dp即可.

代码:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define ll long long
using namespace std; const int MAXN = 4e5 + ;
ll c[MAXN], dp[][MAXN];
int n, a, b; bool cmp(ll x, ll y){
return x > y;
} int dfs(int indx, ll w, ll h){
if(w >= a && h >= b || w >= b && h >= a) return indx;
if(indx > || indx >= n) return MAXN;
if(w >= 1e5) w = 1e5; //注意越界
if(h >= 1e5) h = 1e5;
if(dp[indx][w] != -) return dp[indx][w];
return dp[indx][w] = min(dfs(indx + , w * c[indx], h), dfs(indx + , w, h * c[indx]));
} int main(void){
int h, w;
scanf("%d%d%d%d%d", &a, &b, &h, &w, &n);
for(int i = ; i < n; i++){
scanf("%lld", &c[i]);
}
sort(c, c + n, cmp);
memset(dp, -, sizeof(dp));
int sol = dfs(, w, h);
if(sol != MAXN) cout << sol << endl;
else cout << - << endl;
return ;
}

cf779D(记忆化dp)的更多相关文章

  1. Google Code Jam 2009, Round 1C C. Bribe the Prisoners (记忆化dp)

    Problem In a kingdom there are prison cells (numbered 1 to P) built to form a straight line segment. ...

  2. UVA - 11324 The Largest Clique 强连通缩点+记忆化dp

    题目要求一个最大的弱联通图. 首先对于原图进行强连通缩点,得到新图,这个新图呈链状,类似树结构. 对新图进行记忆化dp,求一条权值最长的链,每一个点的权值就是当前强连通分量点的个数. /* Tarja ...

  3. cf835(预处理 + 记忆化dp)

    题目链接: http://codeforces.com/contest/835/problem/D 题意: 定义 k 度回文串为左半部分和右半部分为 k - 1 度的回文串 . 给出一个字符串 s, ...

  4. Codeforces1107E Vasya and Binary String 记忆化dp

    Codeforces1107E 记忆化dp E. Vasya and Binary String Description: Vasya has a string \(s\) of length \(n ...

  5. POJ 1088 滑雪(简单的记忆化dp)

    题目 又一道可以称之为dp的题目,虽然看了别人的代码,但是我的代码写的还是很挫,,,,,, //看了题解做的简单的记忆化dp #include<stdio.h> #include<a ...

  6. POJ 1088 滑雪 记忆化DP

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K       Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度 ...

  7. BNU 25593 Prime Time 记忆化dp

    题目链接:点击打开链接 题意: 一个游戏由3个人轮流玩 每局游戏由当中一名玩家选择一个数字作为開始 目的:获得最小的得分 对于当前玩家 O .面对 u 这个数字 则他的操作有: 1. 计分 u +1 ...

  8. [luogu]P1514 引水入城[搜索][记忆化][DP]

    [luogu]P1514 引水入城 引水入城 题目描述在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形 ,如下图所示,其中每个格 ...

  9. 记忆化dp博弈

    题:http://poj.org/problem?id=2068 题意: 有两个队伍A,B,每个队伍有N个人,交叉坐.即是A(1,3,5,7.....)B(2,4,6,8....).告诉你每个mi(1 ...

随机推荐

  1. linux应用之ntpdate命令联网同步时间

    当Linux服务器的时间不对的时候,可以使用ntpdate工具来校正时间. 安装:yum install ntpdate ntpdate简单用法: # ntpdate ip # ntpdate 210 ...

  2. 三 Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性

    Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性 Views(视图函数)逻辑处理,最终是围绕着两个对象实现的 http请求中产生两个核心对象: http请求:HttpRe ...

  3. 一次websocket的抓包体验

    一个简单的demo 我们知道websocket一种服务端推送技术,首先Websocket是基于HTTP协议的,或者说借用了HTTP的协议来完成一部分握手.后续数据传递是基于TCP的. 客户端代码 &l ...

  4. leetcode 34 Search for a Range(二分法)

    Search for a Range Given a sorted array of integers, find the starting and ending position of a give ...

  5. PS 滤镜——(扭曲)球面化 Spherize

    %%%% Spherize clc; clear all; close all; addpath('E:\PhotoShop Algortihm\Image Processing\PS Algorit ...

  6. script加载之defer和async

    详情请查看:http://www.heiboard.com/?p=2098

  7. Spring boot 学习二:入门

    1: 需要的环境: JDK:至少JDK7才支持Spring boot maven:至少3.2 spring-boot:1.2.5.RELEASE(在pom.xml中指定) 2: 创建一个maven工程 ...

  8. js数组中的reverse()方法

    reverse方法是将数组中的元素的顺序进行反转,在原数组上操作,然后返回原数组.由于本人是学习js的新人,对reverse函数进行了几个小实验,以下实验均在Chrome浏览器上运行 实验一:reve ...

  9. .net 缓存之文件缓存依赖

    CaCheHelp 类中代码如下: #region 根据键从缓存中读取保持的数据 /// <summary> /// 根据键从缓存中读取保持的数据 /// </summary> ...

  10. sharepoint Foundation 2013安装过程

    安装完必备软件后,便可安装sharepoint Foundation 2013