HDU1176 DP 数塔

看了大牛的代码后恍然大悟,然后自己开始写,WA了一下午!

这里有两个坑,让我找了一下午!

AC代码:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include<iostream>
#include<string.h>
#include<algorithm>
const int maxn = 100000+5;
int dp[maxn][12];
using namespace std;
int maxy(int a,int b,int c)
{
 int t;
 if(a>b){t=b;b=a;a=t;}
 if(b>c){t=c;c=b;b=t;}
 return c;
}
int main()
{
 int n,x,T,t;
 while(scanf("%d",&n)!=EOF&&n)
 {
  t=0;
  memset(dp,0,sizeof(dp));
  while(n--)
  {
   scanf("%d%d",&x,&T);
   dp[T][x]++;
   t=max(t,T);
  }
  for(int i=t;i>1;i--)
   for(int j=0;j<11;j++)
   {
    if(j==0)dp[i-1][j]+=max(dp[i][j],dp[i][j+1]);
          else if(j==10)dp[i-1][j]+=max(dp[i][j],dp[i][j-1]);
          else dp[i-1][j]+=maxy(dp[i][j],dp[i][j+1],dp[i][j-1]);
   }
        printf("%d\n",maxy(dp[1][4],dp[1][5],dp[1][6]));
   }
 return 0;
}

第一个坑就是定义很大的数组时,千万不要定义在函数里头,因为函数里头的数组是存放在栈里面的,空间不够大,要定义成全局的数组,全局数组是存放在存储空间里面的。我看着大牛的代码和我的代码找了真的是捉急啊!好在找出来了;

第二个坑就是在我把数据都存好在二维数组之后,处理的过程中,这个if 之后最好是用else if  再用else不要用两个if就完事了。否则这样的话后面那个没有if 有没有else的语句就要被执行两次。

就比如说这样

if(j==0)dp[i-1][j]+=max(dp[i][j],dp[i][j+1]);
          else if(j==10)dp[i-1][j]+=max(dp[i][j],dp[i][j-1]);
          else dp[i-1][j]+=maxy(dp[i][j],dp[i][j+1],dp[i][j-1]);

if(j==0)dp[i-1][j]+=max(dp[i][j],dp[i][j+1]);
 if(j==10)dp[i-1][j]+=max(dp[i][j],dp[i][j-1]);
 dp[i-1][j]+=maxy(dp[i][j],dp[i][j+1],dp[i][j-1]);

再说说这题吧,思路大概是把没时间和位置这两个维度用二维数组表示然后记录,在像数塔一样从下往上累加最后找dp[1][5]也就是从5这个位置的最大和。

原文地址:https://www.cnblogs.com/zzzyyy/p/9866310.html

时间: 2024-10-05 10:48:34

HDU1176 DP 数塔的相关文章

hdu 1176 免费馅饼 (dp 数塔类型)

免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 25712    Accepted Submission(s): 8760 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的1

HDU2084基础DP数塔

数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 33850    Accepted Submission(s): 20206 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?

hdu 1176 dp 数塔问题

哎,一开始没看到从5开始.... 后来写懵了,用了queue正推,记录能到达的节点,p[i+1][j] = max(p[i][j],max(p[i][j-1],p[i][j+1])) 嗯,用stl mle了,自己写queue又tle,不知道为什么嚒,好像bfs我从没a过... 看了dicuss的思路,只看到数塔两个字我就懂了... 只能说巧妙了,区间反向确定我确实没想到... //数塔问题 /* t=0 5 t=1 456 t=2 34567 t=3 2345678 t=4 123456789

HDU 1176免费馅饼 DP数塔问题转化

L - 免费馅饼 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1176 Appoint description:  prayerhgq  (2015-07-28) System Crawler  (2015-11-21) Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.

poj3176--Cow Bowling(dp:数塔问题)

Cow Bowling Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14028   Accepted: 9302 Description The cows don't use actual bowling balls when they go bowling. They each take a number (in the range 0..99), though, and line up in a standard

hdoj1176 免费馅饼(dp 数塔)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1176 思路: 这道题不复杂,很明显是个dp题,数据比较大,搜索应该会超时,想到如何初始化,注意细节就差不多了.定义dp数组,边输入边初始化,dp[i][j]表示第i秒j处的掉落馅饼个数.dp过程从最后一秒逆向进行更方便,过程中dp[i][j]表示逆向到第i秒j处得到馅饼的最大值.有个坑点:最后输入的一组数据的时间不一定是最后一秒,我在这wa了一发.详见代码: 1 #include<bits/stdc

hdu1176 免费馅饼 ( 数塔(DP))

免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 32770    Accepted Submission(s): 11169 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的

HDU 2084 数塔(简单DP入门)

数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 41852    Accepted Submission(s): 24820 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?

HDOJ1176 免费馅饼 【DP】+【经典数塔】

免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 23986    Accepted Submission(s): 8093 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的1