码迷,mamicode.com
首页 > 其他好文 > 详细

HDU1176 DP 数塔

时间:2018-10-28 19:14:57      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:最大   就是   lse   turn   printf   二维   ++   string   ace   

看了大牛的代码后恍然大悟,然后自己开始写,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这个位置的最大和。

HDU1176 DP 数塔

标签:最大   就是   lse   turn   printf   二维   ++   string   ace   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!