博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu1176免费馅饼
阅读量:5103 次
发布时间:2019-06-13

本文共 2561 字,大约阅读时间需要 8 分钟。

代码有点长,不过ACCEPT了

创新点是输入时,用set数组来表示第t秒x个位置上下了一个饼

看了人家给得特殊例子,发现一个问题,当第i秒没有饼下来,或者第i秒饼下的位置人没有走到,这两种特殊情况,所以就加了以下的几行代码

if(set[i][j-1]!=0&&j-1>=0)dp[i][j-1]=max(dp[i][j-1],dp[i-1][j]+set[i][j-1]);

if(set[i][j]!=0)dp[i][j]=max(dp[i][j],dp[i-1][j]+set[i][j]);
if(set[i][j+1]!=0&&j+1<=10)dp[i][j+1]=max(dp[i][j+1],dp[i-1][j]+set[i][j+1]);
if(set[i][j-1]==0&&j-1>=0)dp[i][j-1]=max(dp[i][j-1],dp[i-1][j]+set[i][j-1]);
if(set[i][j]==0)dp[i][j]=max(dp[i][j],dp[i-1][j]+set[i][j]);
if(set[i][j+1]==0&&j+1<=10)dp[i][j+1]=max(dp[i][j+1],dp[i-1][j]+set[i][j+1]);

#include "iostream"#include "string.h"using namespace std;int max(int a,int b){
return a>b?a:b;}int set[100010][12],dp[100010][16];int main(){ int n,time,maxb,i,x,t,j; while(cin>>n){ if(!n)break; time=0;maxb=0; memset(set,0,sizeof(set)); for(i=1;i<=n;i++){cin>>x>>t;set[t][x]++;time=max(time,t);} for(i=0;i<=time;i++){ for(j=0;j<=10;j++) dp[i][j]=0; } dp[0][5]=1; for(i=1;i<=time;i++){ for(j=0;j<=10;j++){ if(dp[i-1][j]){ if(set[i][j-1]!=0&&j-1>=0)dp[i][j-1]=max(dp[i][j-1],dp[i-1][j]+set[i][j-1]); if(set[i][j]!=0)dp[i][j]=max(dp[i][j],dp[i-1][j]+set[i][j]); if(set[i][j+1]!=0&&j+1<=10)dp[i][j+1]=max(dp[i][j+1],dp[i-1][j]+set[i][j+1]); if(set[i][j-1]==0&&j-1>=0)dp[i][j-1]=max(dp[i][j-1],dp[i-1][j]+set[i][j-1]); if(set[i][j]==0)dp[i][j]=max(dp[i][j],dp[i-1][j]+set[i][j]); if(set[i][j+1]==0&&j+1<=10)dp[i][j+1]=max(dp[i][j+1],dp[i-1][j]+set[i][j+1]); } } //for(j=0;j<=10;j++)cout<
<<' ';cout<

看看人家网上的答案,才知道,自己的重要部分的代码真的挺长的,大神说这是数塔的变型,而且他跟我的一个不同点是,我从0 5走到最后,他是从最后往回走,走到0 5

看看大神的代码吧

#include 
#include
#include
using namespace std;int max3(int a,int b,int c){ a = a>b?a:b; a = a>c?a:c; return a;}int max2(int a,int b){ a = a>b?a:b; return a;}int t[100001][11];int main(){ int n,T,x,max; while(scanf("%d",&n)&&n) { memset(t,0,sizeof(t)); max = 0; while(n--) { scanf("%d %d",&x,&T); t[T][x]++; max = max>T?max:T; } for(int i = max-1; i >= 0; i--) { for(int j = 0; j <= 10; j++) { if(j==0)t[i][j] += max2(t[i+1][j],t[i+1][j+1]); else if(j==10) t[i][j] += max2(t[i+1][j],t[i+1][j-1]); else t[i][j] += max3(t[i+1][j-1],t[i+1][j],t[i+1][j+1]); } } cout<
<

 

转载于:https://www.cnblogs.com/dowson/p/3281631.html

你可能感兴趣的文章
GDOI DAY1游记
查看>>
收集WebDriver的执行命令和参数信息
查看>>
数据结构与算法(三)-线性表之静态链表
查看>>
mac下的mysql报错:ERROR 1045(28000)和ERROR 2002 (HY000)的解决办法
查看>>
快速幂
查看>>
改善C#公共程序类库质量的10种方法
查看>>
AIO 开始不定时的抛异常: java.io.IOException: 指定的网络名不再可用
查看>>
MyBaits动态sql语句
查看>>
HDU4405(期望DP)
查看>>
拉格朗日乘子法 那些年学过的高数
查看>>
vs code 的便捷使用
查看>>
Spring MVC @ResponseBody返回中文字符串乱码问题
查看>>
用户空间与内核空间,进程上下文与中断上下文[总结]
查看>>
JS 中的跨域请求
查看>>
JAVA开发环境搭建
查看>>
mysql基础语句
查看>>
Oracle中的rownum不能使用大于>的问题
查看>>
[Data Structure & Algorithm] 有向无环图的拓扑排序及关键路径
查看>>
cassandra vs mongo (1)存储引擎
查看>>
Visual Studio基于CMake配置opencv1.0.0、opencv2.2
查看>>