アリスとボブは、ゲームをプレイしています。このゲームは、いくつかの同一の鍋や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;
}