HDU2571:Destiny(DP)超詳細ソリューション

タイトル

谷を越えるということは、あなたが巨大な悪魔のレモンにいつまでも近づくことを意味します!
しかし、それを考えることができる人は、エビ、兵士、カニを斬首した後、再び運命の迷路の試練に直面しました。これは、魔王によって設定された別の施設です。あなたが誰であろうと、1時間以上迷路に閉じ込められていると、あなたは間違いなく死ぬでしょう!
貧しいyifenfeiがMMを救うために振り返ることなく迷路に飛び込んだ。しつこい彼を助けましょう!
運命の大迷路は、次の図に示すように、2次元のグリッド配列として見ることができます。

もちろん、元々は左上隅にありましたが、目的は右下隅の大きな悪魔の位置に到達することです。迷路の各グリッドは、幸運の女神または苦痛の悪魔の郷愁によって呪われているため、各グリッドは値に対応しており、そこに行くと、対応する値が自動的に取得されます。
現在、yifenfeiは右または下にしか移動できず、一度に1ステップだけであることが規定されています。ただし、右側に移動する場合、一度に1つのグリッドに移動するか、列数が現在の列の倍数であるグリッドに移動できます。つまり、現在のグリッドが(x、y)の場合、次のステップは(x + 1 、y)、(x、y + 1)または(x、y * k)ここでk> 1。
魔王を最も確実に排除できるようにするために、Yifenfeiはこの運命の迷路で最も幸運な価値を得ることを望んでいます。

入力
入力データは、最初に整数Cで、テストデータグループの数を示します。
テストデータの各セットの最初の行は、行と列の数を表す2つの整数n、m(1 <= n <= 20,10 <= m <= 1000)で、
その後にn行のデータが続き、各行にはm個の整数は、n行m列のグリッドに対応するラッキー値K(| k | <100)を表します。
出力
テストデータの各セットに対応する整数を出力してください。これは、yifenfeiが取得できるラッキーの最大値を示しています。
入力
入力データは、最初に整数Cで、テストデータグループの数を示します。
テストデータの各セットの最初の行は、行と列の数を表す2つの整数n、m(1 <= n <= 20,10 <= m <= 1000)で、
その後にn行のデータが続き、各行にはm個の整数は、n行m列のグリッドに対応するラッキー値K(| k | <100)を表します。
出力
テストデータの各セットに対応する整数を出力してください。これは、yifenfeiが取得できるラッキーの最大値を示しています。
入力例

1
3 8
9 10 10 10 10 -10 10 10
10 -11 -1 0 2 11 10 -20
-11 -11 10 11 2 10 -10 -10
Sample Output
52

コードは次のとおりです。

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e3 + 10;
const int inf = -99999;
int dp[25][maxn],a[25][maxn]; /////dp[i][j]表示走到i行j列时最大的幸运值 ,那么dp[n][m]即为答案
int main()
{
	int T;
	cin >> T;
	while (T--)
	{
		int n, m;
		cin >> n >> m;
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= m; j++)
				cin >> a[i][j];
		for (int i = 0; i <= n; i++)  //左边界 (因为有负值,故初始化为一个很大的负数)
			dp[i][0] = inf;
		for (int j = 0; j <= m; j++)  //上边界
			dp[0][j] = inf;
		//dp[1][0] = dp[0][1] = 0;
		for (int i = 1; i <= n; i++)
		{
			for (int j = 1; j <= m; j++)
			{
				if (i == 1 && j == 1)   ////dp[1][1]的值可以直接得出,不需要状态转移方程
				{
					dp[i][j] = a[i][j];
					continue;
				}
				dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); ////从下走一步或从右走一步
				for (int k = 2; k <=j; k++)
				{
					if (j%k == 0)
					{
						dp[i][j] = max(dp[i][j], dp[i][j / k]);
					}
					
				}
				dp[i][j] = dp[i][j] + a[i][j];
			}
			
		}
		cout << dp[n][m] << endl;
	}
	return 0;
}
元の記事を公開7件 ・いい ね0件 アクセス69

おすすめ

転載: blog.csdn.net/weixin_45629285/article/details/105459701