列表

详情


NC16777. 黑妹的游戏II

描述

黑妹和黑弟又聚在一起玩游戏了,这次他们选择在一个n*m的棋盘上玩游戏,棋盘上的每个方格都有一个非负的分数,
游戏从左上角开始右下角结束,双方交替的选择一个方格并获得方格上相应的分数,一方选择的方格必须在上一步另一方选择的方格
的右边或者下面,黑妹先开始。现在黑妹想知道,如果双方都采取最优策略(最优策略是指双方都希望最终自己的总分数减去对方的总分数最大),她的总分数减去黑弟的总分数会是多少?

输入描述

第一行一个整数T表示数据的组数。(1 ≤ T ≤ 20)
对于每组数据:
第一行两个整数n,m表示棋盘的规格。(1 ≤ n, m ≤ 500)
接下来n行每行m个整数aij表示方格对应的分数。()

输出描述

对于每组数据输出一行表示答案。

示例1

输入:

1 
2 2 
1 3 
4 5

输出:

2

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 537ms, 内存消耗: 1508K, 提交时间: 2018-06-29 19:36:58

#include<bits/stdc++.h>
using namespace std;
int a[510][510];
int main(){
	int T,n,m;
	cin>>T;
	for(int t=1;t<=T;t++){
		memset(a,0,sizeof(a));
		cin>>n>>m;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				scanf("%d",a[i]+j);
		for(int i=n;i>=1;i--)
			for(int j=m;j>=1;j--){
				if(j+1<=m){
					if(i+1<=n)a[i][j]=min(a[i][j]-a[i+1][j],a[i][j]-a[i][j+1]);
					else a[i][j]=a[i][j]-a[i][j+1];
				}
				else if(i+1<=n)a[i][j]=a[i][j]-a[i+1][j];
			}
		cout<<a[1][1]<<endl;
	}
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 644ms, 内存消耗: 1520K, 提交时间: 2020-04-03 20:25:10

#include<iostream>
using namespace std;
int t,n,m;
int amap[505][505];
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d %d",&n,&m);
		for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		scanf("%d",&amap[i][j]);
		for(int i=n;i>=1;--i)
		for(int j=m;j>=1;--j)
		if(i!=n&&j!=m) amap[i][j]-=max(amap[i+1][j],amap[i][j+1]);
		else if(i!=n&&j==m) amap[i][j]-=amap[i+1][j];
		else if(j!=m&&i==n) amap[i][j]-=amap[i][j+1];
		printf("%d\n",amap[1][1]);
	}
}

上一题