ABC 244 E补题

E - King Bombee

完全没有想到是DP....

事后总结:要取模,奇偶,求方案数。

就用DP[i][j][k]来表示,从走到i这个点,j为所在序列中的位置,而k用来表示奇偶性。

如果加入了一个数,和X一样,显然现在它变成了偶/奇,从原来的奇偶性相反的DP中转移过来

如果未加入,从原来的奇偶性相同的DP中转移过来

AC代码:

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <map>
//#include <pair>
#include<utility>
#define int long long
using namespace std;
const int mod = 998244353;
int dp[2010][2010][2];
pair<int, int> v[2010];
signed main() {
	int N,M,K,S,T,X;
//	数列里面要有k+1个点,全部从1-n里面拿
//	要满足起点是s,终点是t,并且A[i]要和A[i+1]相连
//	x出现偶数次
	
//	思路:dp[i][j][k]表示第i个点,序列中第j个位置,x出现的奇数还是偶数次
	cin>>N>>M>>K>>S>>T>>X;
	for(int i=1;i<=M;++i){cin>>v[i].first;cin>>v[i].second;}
	dp[S][0][0]=1;
	for(int i=0;i<K;++i){
		for(int j=1;j<=M;++j){
			int x = v[j].first;int y=v[j].second;
			for(int k=0;k<=1;++k){
//				奇数和偶数的转换
				(dp[x][i+1][k] += dp[y][i][k ^ (X==y)]) %= mod;
				(dp[y][i+1][k] += dp[x][i][k ^ (X==x)]) %= mod;
			}
		}
	}
	cout<<dp[T][K][0]<<endl;
//	x x x z
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_60789461/article/details/123629295
ABC