1. 程式人生 > >HDU1176 DP 數塔

HDU1176 DP 數塔

很大的 數塔 space 和我 lse printf 累加 最大 數據

看了大牛的代碼後恍然大悟,然後自己開始寫,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 數塔