看到有帖子里说是数组小了,萌萌叉叉的我又去看了下R和C的范围就是100呀,无奈抱着玄学之心去试了一下(其实我也认为不会WA一半)。结果调成1000又对了一个就60分!再尝试5100结果太大不行,调小一点4000多就又提高了,80分!刚刚试了试把a数组调成相同的4000结果WA了一般又50分了!
#include<iostream>
#include<algorithm>//有很多算法函数,至少可以用min哦
#include<cstring>//使用memsent需要
using namespace std;
int a[3100][3100] = {};//存储滑雪地图
int dp[4100][4100] = {};//存储记忆搜索
int R, C;
int slove(int i, int j)
{
if (i < 0 || i >= R || j < 0 || j >= C)return 0;//如果越界就返回0
if (dp[i][j] != -1)return dp[i][j];
int q=-1, w=-1, e=-1, r=-1;//定义四个变量
if(a[i-1][j]<a[i][j])
q = slove(i - 1, j);
if (a[i][j-1] < a[i][j])
w = slove(i , j-1);
if (a[i][j+1] < a[i][j])
e = slove(i, j+1);
if (a[i+1][j] < a[i][j])
r = slove(i+1, j);
if ((q + w + e + r) == -4)return dp[i][j] = 0;//如果四边都为-1都不能走,则赋值且返回0
return dp[i][j] = 1 + max(max(q,w),max(e,r));//否则状态转移
}
int main()
{
cin >> R >> C;
for (int i = 0; i < R; i++)
{
for (int j = 0; j < C; j++)
{
cin >> a[i][j];
}
}
memset(dp, -1, sizeof(dp));
int max = 0;
for (int i = 0; i < R; i++)//枚举状态
{
for (int j = 0; j < C; j++)
{
int x = slove(i,j);
if (x > max)max = x;//记录最大值
}
}
cout << max << endl;
return 0;
}
刚学习动态规划入门,希望大家指教!