(D DP)3605 - マーブルにZOJを探します

アリスとボブは、ゲームをプレイしています。このゲームは、いくつかの同一の鍋や1つの大理石で再生されます。ゲームが起動すると、アリスは、1行にポットを置くと、ポットの一つに大理石を置きます。その後、ボブは、ポットの内部を見ることができません。次いで、アリスはswappingsのシーケンスを行い、ボブは大理石の中にあるポット推測。スワッピングのそれぞれにおいて、アリスは、二つの異なったポットを選択し、それらの位置を入れ替え。

残念ながら、アリスの行動は非常に高速なので、ボブはアリスが行ったすべてのアクションとしてメートルのswappingsと関連し、これらのk swappingsのKをキャッチすることができます。今大理石がである最初のポット、とswappingsのシーケンスを与え、あなたはボブが最も可能性が推測され、ポットを計算するように求められます。あなたはボブが等しい可能性swappingsのいずれかを逃したと仮定することができます。

入力
、入力ファイル内のいくつかのテストケースがあります。入力ファイルの最初の行は、整数N(N≈100)が含まれ、次いでNケースが続きます。

各テストケースの最初の行は、ポットの数、アリスが作るswappingsの数である4つの整数N、M、K及びS(0 <S≤N≤50、50≤0≤k個の≤m)を、含まボブがキャッチswappingsの数及び大理石がである初期ポットのインデックス。鍋は1からnまでのインデックス付けされています。次に、m個の行は、二つの整数、i番目のスワッピング二つポットアリススワップを伝える、AIとBI(1≤AI、BI≤n)が含まれているそれぞれが、従います。

Outout
各テストケースについては、ボブが最も可能性が推測出力鍋。ネクタイ、出力最小のものがある場合。

サンプル入力
3
3 1 1 1
1 2
3 1 0 1
1 2
3 3 2 2
2 3
3 2
1 2
サンプル出力
2
1
3

問題の意味:n個のカップがm回二十から二交換作業の開始時にのみ石があり、そこにあるが、あなただけの時間を見ることができる尋ねるのどのK、K時間の中で最も可能性の高い推測たカップ後

[i]はDP [J]:思考 [x]は、i番目の元交換を表しj回を見て、石の最後の位置は、プログラム番号のXの
異なる私は、すべてのjについて(jは、私が満たさなければならないよりも小さく、比小さなk)は、我々は、為替を見てきましたし、2例を見ていない交換は
表示されませんでした:DP [I] [J] [X] + = DP [I-1] [J] [X]
見て:
1。この場合はラウンド独立カップの動作のための(ラウンドI)、即ちX!= [I] && X!= B [i]になります。そして、それはまた、最後のラウンドの終了時にXです。DP [I] [J] [X] + DP = [1-I] [J-1] [X]
2 X == A [i]は、それがBの端である[i]を転送する場合すなわちDP [I] [J] [ X] + = DP [I-1] [J-1] [B [I]
であれば一端からのX == B [i]は、[I]転送、即ちDP [I] [J] [ X] + = DP [I-1] [J-1] [I]

#include<bits/stdc++.h>
using namespace std;
#define N 60
typedef long long ll;
ll dp[N][N][N];    //注意结果很大,要用long long存,否则会wa
int a[N];
int b[N];
int main()
{
	int n,m,k,s,t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d%d%d",&n,&m,&k,&s);
		memset(dp,0,sizeof(dp));
		dp[0][0][s]=1;
		for(int i=1;i<=m;i++)
			scanf("%d%d",&a[i],&b[i]);
		for(int i=1;i<=m;i++)
		{
			dp[i][0][s]=1;
			for(int j=1;j<=min(i,k);j++)
			{	
				for(int len=1;len<=n;len++)
				{
					dp[i][j][len]+=dp[i-1][j][len];   //没看见,直接继承上一轮的结果
					if(len==a[i])       //看到了,分类讨论
						dp[i][j][a[i]]+=dp[i-1][j-1][b[i]];
					else if(len==b[i])
						dp[i][j][b[i]]+=dp[i-1][j-1][a[i]];
					else
						dp[i][j][len]+=dp[i-1][j-1][len];
				}
			}
		}
		ll ans=dp[m][k][1],u=1;
		for(int i=2;i<=n;i++)
			if(dp[m][k][i]>ans)
			{
				ans=dp[m][k][i];
				u=i;
			}
		cout<<u<<endl;
	}
	return 0;
}

おすすめ

転載: blog.csdn.net/weixin_43693379/article/details/91129800