看了大牛的代码后恍然大悟,然后自己开始写,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