POJ 1088解题报告

本来十分简单的一道题,可却花了我那么长时间。测试了各种数据都是对的,一提交就WA,郁闷死了!!!

后来才发现是search()函数中的temp[4]没有初始化。。。

改成 int temp[4]={0}后就AC了。。。。

244K 16MS C++ 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<stdio.h>
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<m;i++)
   for(j=0;j<n;j++)
   {
    r[i][j]=0;//记得初始化
    scanf("%d",&dp[i][j]);
   }
  int max=0,temp;
  for(i=0;i<m;i++)
   for(j=0;j<n;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<m&&dp[i+1][j]<dp[i][j])
     temp[0]=search(i+1,j,m,n);
 if(i-1>=0&&dp[i-1][j]<dp[i][j])
     temp[1]=search(i-1,j,m,n);
 if(j+1<n&&dp[i][j+1]<dp[i][j])
     temp[2]=search(i,j+1,m,n);
 if(j-1>=0&&dp[i][j-1]<dp[i][j])
     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];
}

原文地址:https://www.cnblogs.com/ltfbk/p/DP.html