HDU1176 DP 数塔

Posted zzzyyy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ",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这个位置的最大和。













































以上是关于HDU1176 DP 数塔的主要内容,如果未能解决你的问题,请参考以下文章

hdoj1176 免费馅饼(dp 数塔)

HDU 1176 免费馅饼

hdu 1176

HDU 1176 免费馅饼 (动态规划另类数塔)

hdu-1176(动态规划)

HDU 1176