开心每一天 ,救命啊!

NOIP2000-S-4-方格取数 Runtime Error

0 分
*题目描述:
设有
N

N
N∗N的方格图
(
N
<

1000
)
(N<=1000),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字
0
0。

某人从图的左上角的
A
A 点
(
1
,
1
)
(1,1)出发,可以向下行走,也可以向右走,直到到达右下角的
B
B点
(
N
,
N
)
(N,N)。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字
0
0)。

此人从
A
A点到
B
B 点,试找出
1
1条这样的路径,使得取得的数之和为最大。

例如:

8PpqgacUeXnY4AAAAASUVORK5CYII=

输入格式:
第一行为一个整数
N
(
N

1000
)
N(N≤1000),表示
N
×
N
N×N的方格图。

接下来的每行有三个整数,第一个为行号数,第二个为列号数,第三个为在该行、该列上所放的数。一行

000

“000”表示结束。

输出格式:
第一个整数,表示一条路径上取得的最大的和。

样例输入:
8
2 3 13
2 6 6
3 5 7
4 4 14
5 2 21
5 6 4
6 3 15
7 2 14
0 0 0
样例输出:
36
时间:1s 空间:256M*

#include <iostream>
#include <algorithm>
using namespace std; 

const int N = 15;
int dp[N][N][N][N];
int w[1005][1005];
int n;

int max1(int a,int b,int c,int d)
{
	int max2;
	max2=max(a,b);
	max2=max(max2,c);
	max2=max(max2,d);
	return max2;
}

int main(int argc, char** argv) 
{
	int a, b ,c;
	cin>>n;
	
	do 
	{
		cin>>a>>b>>c;
		w[a][b] = c;
	}while(a&&b&&c);
	
	
	for(int i1 = 1; i1 <= n; i1++)
	for(int j1 = 1; j1 <= n; j1++)
		for(int i2 = 1; i2 <= n; i2++)
		for(int j2 = 1; j2 <= n; j2++)
		{
		//这里分别取四个状态的最大值
			dp[i1][j1][i2][j2] = 
			max1(dp[i1-1][j1][i2-1][j2],dp[i1-1][j1][i2][j2-1],dp[i1][j1-1][i2-1][j2],dp[i1][j1-1][i2][j2-1]);
		
			//如果走的重复的话
			if(i1 == i2 && j1 == j2)
			{
				dp[i1][j1][i2][j2] += w[i1][j1];
			}
			else
			{
				dp[i1][j1][i2][j2] += w[i1][j1] + w[i2][j2];
			}
		}
	
	
	
	cout<<dp[n][n][n][n]<<endl;
	return 0;
}

数据改了!!!!

救~

AC了