poj 1088 我的程序被判为wa,各位大侠帮忙看一下我的程序哪错了

keynumber 2012-04-20 03:22:17
我的程序被判为wa,但它提供的测试数据是对的,请各位大虾看一下
程序如下

include <stdio.h>
#include <memory.h>

int max=0; //记录最大下降长度

int c_row,c_col; //接受数组的行和列

int a[100][100]; //记录高度
int v[100][100]; // 记录每个节点的解

int offset[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; //偏移量

int solve(int row,int col);

int main()
{
memset(v,0,sizeof(v));
scanf("%d %d",&c_row,&c_col);
max=0;
for(int i=0;i<c_row;i++){
for(int j=0;j<c_col;j++)
scanf("%d",&a[i][j]);
}
solve(0,0);
printf("%d\n",max);
return 0;
}

//备忘录方法
int solve(int row,int col)
{
if(v[row][col])
return v[row][col];
int r,c;
for(int i=0;i<4;i++)
{
r=row+offset[i][0];
c=col+offset[i][1];
if(r>=0 && c>=0 && r<c_row && c<c_col)
{
if(a[r][c]>a[row][col])
{
int temp=solve(r,c)+1;
if(v[row][col]<temp)
v[row][col]=temp;
}
}
}
if(!v[row][col])
v[row][col]=1;
if(v[row][col]>max)
max=v[row][col];
return v[row][col];
}
...全文
104 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
keynumber 2012-04-21
  • 打赏
  • 举报
回复
谢谢,但我的错哪了?我感觉和你的代码是差不多相同的,只是把四个if替换为一个for循环,求解?
keynumber 2012-04-21
  • 打赏
  • 举报
回复
终于找到问题了,判断条件应为if(a[r][c]<a[row][col])而不是if(a[r][c]>a[row][col])

main函数中的solve()函数应循环调用,否则,求解只是对于一部分数据,比如第一行第一列中入果为数

据中最小的数,则函数只执行一次,就返回1了。

非常感谢你的数据和代码
hen_hao_ji 2012-04-21
  • 打赏
  • 举报
回复
从任何点出发都要求出最长的路线,然后求出最长的那条,你是这样做的吗?
hen_hao_ji 2012-04-20
  • 打赏
  • 举报
回复
楼主,你看下这组测试数据:
3 3
9 4 3
6 1 1
5 4 3
楼主,做ACM题应该自己想测试数据,仅仅用一个样例是不行的。。
附个代码,也是记忆化搜索做的:

#include <iostream>
using namespace std;

int matrix[100][100];// 保存原始数据
int cnt[100][100]; // 记录每一个点的最大滑雪长度
int row ,col;

int DP(int i, int j)
{
int max = 0;

// 如果已经处理过,直接返回(记忆化搜索效率之所以高的原因:不重复计算)
if (cnt[i][j] > 0)
{
return cnt[i][j];
}

// 以下四块语句,只对合法的i和j,进行递归(递归的重点就是:剪去所有不合法的,只处理所有合法的!!!)
if (j-1 >= 0)
{
if (matrix[i][j] > matrix[i][j-1])
{
if (max < DP(i, j-1))
{
max = DP(i, j-1);
}
}
}

if (j+1 <= col-1)
{
if (matrix[i][j] > matrix[i][j+1])
{
if (max < DP(i, j+1))
{
max = DP(i, j+1);
}
}
}

if (i-1 >= 0)
{
if (matrix[i][j] > matrix[i-1][j])
{
if (max < DP(i-1, j))
{
max = DP(i-1, j);
}
}
}


// 在这里我曾经很SB地将row错写成col,调试所有的行数等于列数的数据都没有问题,可是一提交就Wa
// 注意,行数可能不等于列数!!!!
if (i+1 <= row-1)
{
if (matrix[i][j] > matrix[i+1][j])
{
if (max < DP(i+1, j))
{
max = DP(i+1, j);
}
}
}

// 将结果记录在cnt数组中(记忆化搜索的重点)

// 如果左右上下都没有一个点的值比这个点的值大,则cnt[i][j] = max+1 = 1
// 否则将左右上下各点最大滑雪长度记录在max中, 则cnt[i][j] = max+1
// 这就是max为什么要初始化为0的原因.
return cnt[i][j] = max + 1;
}


int main()
{

int i, j;
cin>>row>>col;

// 初始化数据
for (i=0; i<=row-1; i++)
{
for (j=0; j<=col-1; j++)
{
cin>>matrix[i][j];
cnt[i][j] == 0;
}
}

// 处理每一个点,将其最大滑雪长度保存在cnt数组里面
for (i=0; i<=row-1; i++)
{
for (j=0; j<=col-1; j++)
{
DP(i, j);
}
}


// 遍历数组,求最大值,在这里因为将cnt错写成matrix而wa了一次,真不应该!!!
for (i=0; i<=row-1; i++)
{
for (j=0; j<=col-1; j++)
{
if (cnt[0][0] < cnt[i][j])
{
cnt[0][0] = cnt[i][j];
}
}
}

cout<<cnt[0][0]<<endl;

return 0;
}


keynumber 2012-04-20
  • 打赏
  • 举报
回复
动态规划
lisency 2012-04-20
  • 打赏
  • 举报
回复
这道题是关于哪一方面的
keynumber 2012-04-20
  • 打赏
  • 举报
回复
附上题目

Language:Default滑雪
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 56299 Accepted: 20395

Description

Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子

1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。
Input

输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。
Output

输出最长区域的长度。
Sample Input

5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

Sample Output

25
Source


64,673

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧