每日一题 day25 打卡
Analysis
dp[i][j]=dp[i-1][j-1]*(i-j)+dp[i-1][j]*(j+1);
其中i和j是表示前i个数中有j个小于号,j<=i-1
要在长度为i的数列中插入一个数,那么共有i+1个位置可以插入(第一个位置最后一个位置和中间的i-1个位置)。由于插入的数字大于之前所有数,那么在原串中是小于号的位置插入这个数会多出来一个大于号,小于号数量则不变,如果在大于号位置插入会多一个小于号,而插在头位置也多一个大于,末位置多一个小于,总计,使小于号数量不变的位置有(j+1)个,剩下的(i-j)个位置会使小于号数量增加、
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define int long long 6 #define maxn 1000+10 7 #define mod 2015 8 using namespace std; 9 inline int read() 10 { 11 int x=0; 12 bool f=1; 13 char c=getchar(); 14 for(; !isdigit(c); c=getchar()) if(c=='-') f=0; 15 for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+c-'0'; 16 if(f) return x; 17 return 0-x; 18 } 19 inline void write(int x) 20 { 21 if(x<0){putchar('-');x=-x;} 22 if(x>9)write(x/10); 23 putchar(x%10+'0'); 24 } 25 int n,k; 26 int dp[maxn][maxn]; 27 signed main() 28 { 29 n=read();k=read(); 30 dp[1][0]=1; 31 for(int i=2;i<=n;i++) 32 { 33 dp[i][0]=1; 34 for(int j=1;j<=k;j++) 35 { 36 dp[i][j]+=(dp[i-1][j]*(j+1))%mod; 37 dp[i][j]+=(dp[i-1][j-1]*(i-j))%mod; 38 dp[i][j]%=mod; 39 } 40 } 41 write(dp[n][k]); 42 return 0; 43 }
请各位大佬斧正(反正我不认识斧正是什么意思)