CF1227F1 Wrong Answer on test 233 (Easy Version)(dp)
设计二维dp状态为f[][],处理到i,比原来方案多j的答案是多少
这样可以根据h[i]和h[i+1]来作比较得到
这里因为多j个可能是负的,也就是当前答案不一定是正的,因此我们考虑坐标平移2001个位置,把2001这个点当作原点,这样不会产生边界情况
#include<bits/stdc++.h> #define getsz(p) (p?p->sz:0) using namespace std; typedef long long ll; typedef pair<ll,int> pll; const int N=4e5+10; const ll mod=998244353; ll f[2010][4020]; int h[N]; int main(){ ios::sync_with_stdio(false); int n; ll k; cin>>n>>k; int i; for(i=1;i<=n;i++) cin>>h[i]; if(k==1){ cout<<0<<endl; return 0; } memset(f,0,sizeof f); f[0][2001]=1; for(i=1;i<=n;i++){ for(int j=1;j<=4001;j++){ if(h[i]==h[i%n+1]){ f[i][j]=f[i-1][j]*k%mod; } else{ f[i][j]=(f[i-1][j-1]+f[i-1][j+1]+f[i-1][j]*(k-2))%mod; } } } ll ans=0; for(i=2002;i<=2001+n;i++){ ans=(ans+f[n][i])%mod; } cout<<ans<<endl; return 0; }
没有人不辛苦,只有人不喊疼