2014第五ブルーブリッジカップグループB I C ++タイトル

2014第五ブルーブリッジカップグループB I C ++タイトル

地下宮殿の宝物を取ります

王のXは、地下宮殿宝庫宝物を持っています。n×mの格子行列です。各グリッドは、赤ちゃんを置きます。ラベルの値に、それぞれの赤ちゃんに近いです。

上部の地下宮殿の入り口には、右下隅にある出口にコーナーを残しました。

ボブは、地下宮殿の入口に撮影された、王は右または下のみに歩くように頼みました。

グリッド値は、赤ちゃんがどんな赤ちゃん暁明の手の値よりも大きい場合には、暁明は(もちろん、あなたが取ることができない)それを拾うことができ、グリッドによって歩きました。

ボブは、出口に行ったとき、彼は赤ん坊のk個の手の中にあることを起こる場合は、その後、赤ちゃんはボブに与えられます。

してくださいヘルプ暁明は、与えられた状況で、彼はこのk個の宝物を得るために、異なる作用コース数を持っている、と語りました。

【数据格式】

输入一行3个整数,用空格分开:n m k (1<=n,m<=50, 1<=k<=12)

接下来有 n 行数据,每行有 m 个整数 Ci (0<=Ci<=12)代表这个格子上的宝物的价值

要求输出一个整数,表示正好取k个宝贝的行动方案数。该数字可能很大,输出它对 1000000007 取模的结果。
例如,输入:
2 2 2
1 2
2 1
程序应该输出:
2

再例如,输入:
2 3 2
1 2 3
2 1 5
程序应该输出:
14

この質問は、メモリの検索です。
オリジナルのシンプルなのDFSと考えてください。その後、データは畏敬の念で私を聞かせて50 * 50です。または、正直なメモリを検索します。

唯一のダウンまたは右に。
そして、ライン上の最大レコード。手には大きな保持よりも、現在のグリッドの値の場合。(厳密大)
、2つのオプションがあります。取るか取りません。
小さな場合は、選択の余地がなかったです。のみ取ることはありません。
したがって、
[X] DP [Y] [和] [MAXX]
レコードは、現在の点(x、y)は和アイテムを取っ示します。これのMAXXの最大

DPは-1に初期化されるので、私は、コードを書いていたとき。次いで、グリッド内のこれらの項目の値は、いくつかは0であり、厳密に大きくなることができます。そうDFSを開始するときMAXX = -1;
そう最後に一次元コード部DP事実、より大きい方の電流の最大値
ない効果。

下方又は右方向中間コード。〜お友達を追加することができるプログラムの数を取りましょうか

ねえ。うんもっと練習が必要

コードセクション

#include <bits/stdc++.h>
#define mst(a, n) memset(a, n, sizeof(a))
const int mod = 1e9 + 7;
const int N = 55;
using namespace std;

int n, m, k;
int a[N][N];
int dp[N][N][15][15];

int dfs(int x, int y, int sum, int maxx)
{
	if (dp[x][y][sum][maxx + 1] != -1)
	{
		return dp[x][y][sum][maxx + 1];
	}
	int ans = 0;
	if (x == n - 1 && y == m - 1)
	{
		if (sum == k || sum == k - 1 && a[x][y] > maxx)
		{
			ans++;
			ans %= mod;
		}
		return dp[x][y][sum][maxx + 1] = ans % mod;
	}
	if (x < n - 1)
	{
		if (a[x][y] > maxx)
		{
			ans += dfs(x + 1, y, sum + 1, a[x][y]);
			ans %= mod;
		}
		ans += dfs(x + 1, y, sum, maxx);
		ans %= mod;
	}
	if (y < m - 1)
	{
		if (a[x][y] > maxx)
		{
			ans += dfs(x, y + 1, sum + 1, a[x][y]);
			ans %= mod;
		} 
		ans += dfs(x, y + 1, sum, maxx);
		ans %= mod;
	}
	return dp[x][y][sum][maxx + 1] = ans % mod;
}

int main()
{
	cin >> n >> m >> k;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			scanf ("%d", &a[i][j]);
		}
	}
	mst(dp, -1);
	cout << dfs(0, 0, 0, -1) << endl;
	return 0;
}
公開された53元の記事 ウォンの賞賛2 ビュー1326

おすすめ

転載: blog.csdn.net/qq_44624316/article/details/104699400