hdu1176 免费馅饼 动态规划 二维数组实现
免费馅饼
Problem Description
为了使问题简化,假设在接下来的一段时间里,馅饼都掉落在0-10这11个位置。开始时gameboy站在5这个位置,因此在第一秒,他只能接到4,5,6这三个位置中期中一个位置上的馅饼。问gameboy最多可能接到多少个馅饼?(假设他的背包可以容纳无穷多个馅饼)
Input
Output
提示:本题的输入数据量比较大,建议用scanf读入,用cin可能会超时。
Example Input
6 5 1 4 1 6 1 7 2 7 2 8 3 0
Example Output
4
一开始写的超时代码:
/*
先按照时间顺序优先到后以及落得位置有小到大排好序,然后再依次进行比较
*/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
struct st
{int p,t;
}a[100005],temp;
int cmp(st a,st b)
{return a.t<b.t;
}
int main()
{int t,q=0;while(scanf("%d",&t),t){q=0;for(int i=0;i<t;i++)scanf("%d%d",&a[i].p,&a[i].t);stable_sort(a,a+t,cmp);int l=0,_max=0,dp[100000]={0},k=0;for(int i=0;i<t-1;++i){for(int j=i+1;j<t&&i!=j;++j){if((a[j].p-a[i].p)>=-1&&(a[j].p-a[i].p)<=1&&(a[j].t-a[i].t)>=-1&&(a[j].t-a[i].t)<=1){k=1;dp[j]=dp[i]+1;}}}for(int i=0;i<t;i++)if(_max<dp[i])_max=dp[i];printf("%d\n",_max+k);}return 0;
}
后来用的是二维数组来写。
设a[i][j]为第i秒的j位置掉下的馅饼数量,f[i][j]为第i秒在j位置接馅饼最多可以接到的最多馅饼数量。由于每秒只能移动一个位置,因此这一状态可能由三种情况达到:
f[i - 1][j - 1]
f[i - 1][j]
f[i - 1][j + 1]
这三种情况中的最大值加上当前位置可以接到的馅饼数即是当前位置可以接到的最大馅饼数量:
f [ i ] [ j ] = max ( f [ i - 1 ] [ j - 1 ] , f [ i - 1 ] [ j ] , f [ i - 1 ] [ j + 1 ] ) + a [ i ] [ j ] ;
可以看出,当前状态与之前同一阶段的多个状态有关,而类似于 Ugly Numbers 等动态规划中的每一阶段都只有一个状态,为区分两者,我将它称为 二维动态规划 。当然,这道题只是二维动态规划中最简单的一种罢了。
#include<stdio.h>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int dp[100005][12];
int main()
{int n,i,j,maxt;int x,t;while(scanf("%d",&n),n){maxt=0;memset(dp,0,sizeof(dp));for(i=0;i<n;i++){scanf("%d%d",&x,&t);dp[t][x]++;if(maxt<t) maxt=t;}for(i=maxt-1;i>=0;i--){dp[i][0]+=max(dp[i+1][1],dp[i+1][0]);for(j=1;j<11;j++){dp[i][j]+=max(max(dp[i+1][j-1],dp[i+1][j]),dp[i+1][j+1]);}}printf("%d\n",dp[0][5]);}return 0;
}
hdu1176 免费馅饼 动态规划 二维数组实现相关推荐
- 动态规划 -- 二维数组中左上到右下的最短路径和。
目录 问题: 应用场景: 分析: C++实现 问题: 给定一个二维数组map[4][4] ={{1,3,5,9},{8,1,3,4},{5,0,6,1},{8,8,4,0}}.求从左上角到右下角的最短 ...
- 问题 A: 【动态规划】采药_二维数组_一维数组
问题 A: [动态规划]采药 时间限制: 1 Sec 内存限制: 64 MB 提交: 35 解决: 15 [提交][状态][讨论版] 题目描述 山洞里有一些不同的草药,采每一株都需要一些时间,每一 ...
- 01背包问题动态规划(二维数组)
01背包问题动态规划(二维数组) 问题描述 一个旅行者有一个最多能装 M 公斤的背包,现在有 n 件物品,它们的重量分别是W1,W2,-,Wn,它们的价值分别为C1,C2,-,Cn,求旅行者能获得 ...
- hdu1176 免费馅饼 ( 数塔(DP))
免费馅饼 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- 建立二维数组_二维数组的 DP
寻找不同路径和 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标 ...
- c语言bool怎么用_C语言中的一维数组和二维数组什么?怎么用?
C++| 匠心之作 从0到1入门学编程[免费]yun.itheima.com C语言除了基本数据类型之外,还提供了构造类型的数据,构造类型的数据包括数组类型.结构体类型和共用体类型.下面我们详细介绍 ...
- floatmap 二维数组_用J中的多维数组进行Arrays.fill
用J中的多维数组进行Arrays.fill 如何在不使用循环的情况下用Java填充多维数组? 我试过了: double[][] arr = new double[20][4]; Arrays.fill ...
- 背包(二维数组版和一维数组版)
一:前言 这是动态规划的经典题型,那么我们也是 按照动态规划五步走的策略分析的 确定dp数组的含义以及下标的含义 确定dp数组的递推公式 确定dp数组的初始化 确定dp数组的遍历顺序 举例验证(如果不 ...
- 二维数组联通子数组和最大
题目要求: 返回一个二维整数数组中最大联通子数组的和. 输入一个二维整形数组,数组里有正数也有负数. 文件输出. 思路:和之前的动态规划相识,把二维数组转换为一维数组,先求每一个列的子数组和最大,最后 ...
最新文章
- 【设计模式】享元模式 实现 ( 实现流程 | 抽象享元类 | 具体享元类 | 享元工厂 | 用户调用 | 代码模板 )
- python评分卡建模-实现WOE编码及IV值计算
- 【C++】字符串中运算符的重载问题
- 学习mysql中使用inner join,left join 等
- 计算机文档设置,电脑这样设置快速的共享文件、分享文档!
- html简单父子页面,js 的 iframe 父子页面通信的简单方法
- python井字棋ai_实现AI下井字棋的alpha-beta剪枝算法(python实现)
- python怎么调用navicat_图中的这个功能应该怎么用Python实现啊?
- vue 点击div 获取位置_vue接入腾讯位置服务之点击事件
- Linux系统管理-(12)-网络配置IP命令
- 15-1 并发版爬虫架构
- 并发编程常见面试题总结一
- python查看数据_使用Python获取GA数据
- Oracle long 类型转 varchar2
- Firefox downloadhelper 视频下载助手
- session 的工作原理?
- 融云 即时通讯 集成相关问题
- 圆形区域的半透明填充
- 小细节见实力,告诉你vivo Z3如何成为爆款千元机
- LeetCode No5. 最长回文子串 题解
热门文章
- Requirements of pair programming
- CSDN 首页的第一屏 广告/新闻 比率 = 40 : 2
- java算法实验标尺问题_在codeigniter项目中使用标尺库
- vue修改计算属性的值_Vue语法高级之计算属性和侦听器
- axure html 360安装扩展,win10系统360浏览器添加Axure扩展的操作方法
- 2017c语言考核册答案,2017年电大《C语言程序设计》形成性考核册答案.doc
- 和catch的区别_BIO、NIO、AIO 的区别是什么?
- php下载文件与服务器有关吗,php 下载文件功能中下载后文件大小与服务器源文件大小不一致...
- 补丁程序正在运行_针对微软4月14日更新补丁会导致蓝屏问题的检测及解决方法...
- rf框架的缺点_2017热门开源自动化测试框架优缺点对比