#include <stdio.h> #include <algorithm> typedef long long ll; const int mod = 1e9+9; const int maxn = 1300; int c[maxn]; ll dp[maxn][maxn];///变化i次颜色为j int main()
{ int n,L; scanf("%d%d",&n,&L); dp[0][0]=1; for(int i=n;i>=1;i--){ for(int j=L;j>=0;j--){
dp[j][c[i]]=dp[j][c[i]]*(n-i+1)%mod; for(int k=0;k<=n;k++){ if(c[i]!=k){
dp[j+1][c[i]]+=dp[j][k]; dp[j][k]=dp[j][k]*(n-i)%mod; }
}
dp[j+1][c[i]]%=mod; }
} ll sum=0; for(int i=0;i<=n;i++)
sum+=dp[L][i]; printf("%d\n",(int)(sum%mod)); return 0; }
第五题我是这样做的,思路是dp,倒着从后往前做,dp[j][k]代表颜色已经变换了J次且最后颜色为k,时间复杂度为O(n^2*L),看代码感觉应该还能优化,不过题目数据好像比较水,这样就过了