设计二维dp状态为f[][],处理到i,比原来方案多j的答案是多少

这样可以根据h[i]和h[i+1]来作比较得到

这里因为多j个可能是负的,也就是当前答案不一定是正的,因此我们考虑坐标平移2001个位置,把2001这个点当作原点,这样不会产生边界情况

CF1227F1   Wrong Answer on test 233 (Easy Version)(dp)_暑假训练CF1227F1   Wrong Answer on test 233 (Easy Version)(dp)_暑假训练_02
#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;
}
View Code

 

没有人不辛苦,只有人不喊疼