本来十分简单的一道题,可却花了我那么长时间。测试了各种数据都是对的,一提交就WA,郁闷死了!!!
后来才发现是search()函数中的temp[4]没有初始化。。。
改成 int temp[4]={0}后就AC了。。。。
244K
16MS
907B
解题思路:(DP)动态规划备忘录法递归求解。
dp[i][j]=1+max{dp[i+1][j],dp[i-1][j],dp[i][j+1],dp[i][j-1]};
避免重复,将计算过的dp[i][j]保存下来,下次直接查询而不再求解。
以下是源代码:
#include
int dp[101][101]={0};
int r[101][101]={0};
int main()
{
int search(int i,int j,int m,int n);
int m,n,i,j;
while(scanf("%d %d",&m,&n)!=EOF)
{
for(i=0;i
for(j=0;j
{
r[i][j]=0;//记得初始化
scanf("%d",&dp[i][j]);
}
int max=0,temp;
for(i=0;i
for(j=0;j
{
temp=search(i,j,m,n);//求以每个节点为起点的最长长度,然后求出整体最长长度
if(temp>max)
max=temp;
}
printf("%d\n",max);
}
return 1;
}
int search(int i,int j,int m,int n)//求以某个节点为起点的最长长度
{
if(r[i][j])//
return r[i][j];
int temp[4]={0};//这儿一定要初始化,否则就WA了
int max=0;
if(i+1
temp[0]=search(i+1,j,m,n);
if(i-1>=0&&dp[i-1][j]
temp[1]=search(i-1,j,m,n);
if(j+1
temp[2]=search(i,j+1,m,n);
if(j-1>=0&&dp[i][j-1]
temp[3]=search(i,j-1,m,n);
for(int k=0;k<4;k++)
if(temp[k]>max)//若temp不初始化为0,则这儿出错
max=temp[k];
r[i][j]=max+1;
return r[i][j];
}