请假一道区间DP题目的思路 ,是安徽省信息学省赛初中组第4题
题目描述
官方题解是这样的:
考虑怎么判断一个序列是不是好的:我们设 fi 表示能不能将 1 到 i 全部消完,考虑 i 和哪一个元素一起消掉,发现如果有 aj = ai 且 fj−1 = 1,则 fi = 1,否则 fi = 0。
考虑根据这个结论设计 dp,我们设 dpi,j,k 表示到了第 i 个位置,有 j 个值满足存在至少一个位置 p 使得 ap = v 且 fp−1 = 1,fi−1 = k。
每次考虑第 i 个位置的值时,只要考虑 fi 是否等于 1,以及是否新增了一个ai = v 且 fi−1 = 1 的值即可。
理解了状态,转移是不难写出来的。
这是正确代码,能详细解释下么:
#include<bits/stdc++.h>
using namespace std;
const int N=3005,mod=1e9+7;
int n,m,f1[N][N],f0[N][N];
int main(){
cin>>n>>m;
f1[0][0]=1;
for(int i=0;i<n;i++)
{
for(int j=0;j<=i;j++){
f1[i+1][j]=(f1[i+1][j]+1ll*f1[i][j]*j)%mod;
f1[i+1][j]=(f1[i+1][j]+1ll*f0[i][j]*j)%mod;
f0[i+1][j+1]=(f0[i+1][j+1]+1ll*f1[i][j]*(m-j))%mod;
f0[i+1][j]=(f0[i+1][j]+1ll*f0[i][j]*(m-j))%mod;
}
}
int ans=0;
for(int i=1;i<=n;i++)
{
ans+=f1[n][i];
ans%=mod;
}
cout<<ans;
return 0;
}
不要aigc生成,说点人话