P1004 方格取数
应用
-
- 13.8K通过
- 26.4K提交
- 题目提供者freshwater
- 评测方式云端评测
- 标签2000
- 难度普及+/提高
- 时空限制1000ms / 128MB
提交 题解
- 提示:收藏到任务计划后,可在首页查看。
最新讨论显示
推荐的相关题目显示
题目描述
设有N \times NN×N的方格图(N \le 9)(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字00。如下图所示(见样例):
A
0 0 0 0 0 0 0 0
0 0 13 0 0 6 0 0
0 0 0 0 7 0 0 0
0 0 0 14 0 0 0 0
0 21 0 0 0 4 0 0
0 0 15 0 0 0 0 0
0 14 0 0 0 0 0 0
0 0 0 0 0 0 0 0
B
某人从图的左上角的AA点出发,可以向下行走,也可以向右走,直到到达右下角的BB点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字00)。
此人从AA点到BB点共走两次,试找出22条这样的路径,使得取得的数之和为最大。
输入输出格式
输入格式:
输入的第一行为一个整数NN(表示N \times NN×N的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。一行单独的00表示输入结束。
输出格式:
只需输出一个整数,表示22条路径上取得的最大的和。
输入输出样例
输入样例#1: 复制
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
输出样例#1: 复制
67
说明
NOIP 2000 提高组第四题
#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<math.h>
#include<vector>
#include<bitset>
#include<iomanip>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define eps (1e-8)
#define MAX 0x3f3f3f3f
#define u_max 1844674407370955161
#define l_max 9223372036854775807
#define i_max 2147483647
#define re register
#define pushup() tree[rt]=tree[rt<<1]+tree[rt<<1|1]
#define nth(k,n) nth_element(a,a+k,a+n); // 将 第K大的放在k位
#define ko() for(int i=2;i<=n;i++) s=(s+k)%i // 约瑟夫
#define ok() v.erase(unique(v.begin(),v.end()),v.end()) // 排序,离散化
using namespace std;
inline int read(){
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' & c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
typedef long long ll;
const double pi = atan(1.)*4.;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3fLL;
const int M=63;
const int N=5e5+5;
int n,dp[15][15][15][15],mapp[15][15];
int dfs(int x,int y,int x1,int y1){ // 记忆化搜索
if(dp[x][y][x1][y1]!=-1) return dp[x][y][x1][y1];
if(x==n&&y==n&&x1==n&&y1==n) // 全部到达n,n
return 0;
int ans=0;
if(x<n&&x1<n){ // 同时向下移动
int d=0;
if((x+1==x1+1)&&(y==y1))
d=mapp[x+1][y];
ans=max(ans,dfs(x+1,y,x1+1,y1)+mapp[x+1][y]+mapp[x1+1][y1]-d);
}
if(y<n&&y1<n){ // 同时向右移动
int d=0;
if((y+1==y1+1)&&(x==x1))
d=mapp[x][y+1];
ans=max(ans,dfs(x,y+1,x1,y1+1)+mapp[x][y+1]+mapp[x1][y1+1]-d);
}
if(x<n&&y1<n){ // 一下一右
int d=0;
if((x+1==x1)&&(y==y1+1))
d=mapp[x+1][y];
ans=max(ans,dfs(x+1,y,x1,y1+1)+mapp[x+1][y]+mapp[x1][y1+1]-d);
}
if(y<n&&x1<n){ // 一右一下
int d=0;
if((y+1==y1)&&(x1+1==x))
d=mapp[x][y+1];
ans=max(ans,dfs(x,y+1,x1+1,y1)+mapp[x][y+1]+mapp[x1+1][y1]-d);
}
return dp[x][y][x1][y1]=ans;
}
int main(){
scanf("%d",&n);
memset(dp,-1,sizeof(dp));
while(true){
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
if(x==0&&y==0&&z==0)
break;
mapp[x][y]=z;
}
printf("%d\n",dfs(1,1,1,1)+mapp[1][1]);
return 0;
}