表示只知道是动态规划,然而还是得看别人的题解,看了以后感觉。果然分类讨论的能力还是不够啊。 #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int n, m, k, s; long long dp[60][60][60]; int A[60], B[60]; //用DP[m][k][n] 表示m次交换,知道了其中的k次,结尾n表示的是最后的状态 void init(){ scanf("%d%d%d%d", &n, &m, &k, &s); for (int i = 1; i <= m; i++){ scanf("%d%d", &A[i], &B[i]); } memset(dp, 0, sizeof(dp)); } void solve(){ dp[0][0][s] = 1;//表示刚开始在s for (int i = 1; i <= m; i++){ dp[i][0][s] = 1;//这次不进行转移 for (int j = 1; j <= min(i, k); j++){ dp[i][j][A[i]] = dp[i - 1][j - 1][B[i]];//等于上一项 dp[i][j][B[i]] = dp[i - 1][j - 1][A[i]]; for (int d = 1; d <= n; d++){ dp[i][j][d] += dp[i-1][j][d]; if (d != A[i] && d != B[i]) dp[i][j][d] += dp[i - 1][j - 1][d]; } } } int cnt = 1; for (int i = 2; i <= n; i++){ if (dp[m][k][cnt] < dp[m][k][i]){ cnt = i; } } printf("%d\n", cnt); } int main(){ int t; scanf("%d", &t); while (t--){ init(); solve(); } return 0; } </cstring></algorithm></cstdio>