AcWing——1027. 方格取数

2020-11-20

题目:

设有 N×N 的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字 0。如下图所示:

2.gif

某人从图中的左上角 A 出发,可以向下行走,也可以向右行走,直到到达右下角的 B 点。

在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字 0)。

此人从 A 点到 B 点共走了两次,试找出两条这样的路径,使得取得的数字和为最大。

输入格式

第一行为一个整数 N,表示 N×N 的方格图。

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

行和列编号从 11 开始。

一行“0 0 0”表示结束。

输出格式

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

数据范围

N≤10N≤10

输入样例:

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

输出样例:

67
/*
Keep clam  Believe youself
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<stack>
#include<set>
#include<cmath>
#define Xiaobo main
#define DEBUG(x) cerr<<#x<<": "<<(x)<<endl
using namespace std;
const int maxn=2e5+7;
const int mod=1e9+7;
const double eps=1e-15;
const double pi=acos(-1);
const int INF=0x3f3f3f3f;
typedef long long ll;
ll read(){ll c = getchar(),Nig = 1,x = 0;while(!isdigit(c) && c!='-')c = getchar();if(c == '-')Nig = -1,c = getchar();while(isdigit(c))x = ((x<<1) + (x<<3)) + (c^'0'),c = getchar();return Nig*x;}
ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b);}
//别急 dp找状态 问题看看本身的规律 贪心找方法

const int N=15;

int n;
int w[N][N];
int f[N*2][N][N];

int Xiaobo()
{
	cin>>n;
	int a,b,c;
	while(cin>>a>>b>>c,a||b||c) {
		w[a][b]=c;
	}
	for(int k=2;k<=n+n;k++) {
		for(int i1=1;i1<=n;i1++) {
			for(int i2=1;i2<=n;i2++) {
				int j1=k-i1;
				int j2=k-i2;
				if(j1>=1&&j1<=n&&j2>=1&&j2<=n) {
					int &x=f[k][i1][i2];
					int t=w[i1][j1];
					if(i1!=i2) t+=w[i2][j2];
					x=max(x,f[k-1][i1-1][i2-1]+t);
					x=max(x,f[k-1][i1-1][i2]+t);
					x=max(x,f[k-1][i1][i2-1]+t);
					x=max(x,f[k-1][i1][i2]+t);
				}
			}
		}
	}	
	cout<<f[n*2][n][n]<<'\n';
	return 0;
}

标题:AcWing——1027. 方格取数
作者:xiaob0
地址:https://www.xiaobo.net.cn/articles/2020/11/20/1605865948890.html