zoukankan      html  css  js  c++  java
  • 【agc002f】Leftmost Ball(动态规划)

    【agc002f】Leftmost Ball(动态规划)

    题面

    atcoder
    洛谷

    题解

    我们从前往后依次把每个颜色按顺序来放,那么如果当前放的是某种颜色的第一个球,那么放的就会变成(0)号颜色,所以无论何时,(0)号颜色的数量不能少于其他颜色的数量。

    可以设状态(f[i][j])表示前面一共放了(i)(0)号颜色的球,而一共出现了(j)种其他颜色的球,根据上面的东西,可以知道(ige j)。每次转移我们分成两种考虑。第一种就直接在后面接一个(0)号颜色的球,这个不需要考虑任何决策,直接转移即可,也就是(f[i][j]+=f[i-1][j])。另外一种转移是选择一共新的颜色,抛去前面已经放好的(0)号颜色的前,抛去当前位置放下一个当前颜色的球,那么还需要在后面选择(k-2)个位置来放这些球,而后面剩下的空位个数显然是可以算的。首先还剩下(n-i)(0)号颜色的球没有放,所以提供(n-i)个空位,前面一共只出现了(j-1)种颜色,所以还有((n-j+1)*(k-1))个空位,但是当前的位置被钦定放这种新的颜色,所以还要减少一个位置。

    也就是转移长成这个样子:

    [f[i][j]=f[i-1][j]+C_{(n-i)+(n-j+1)*(k-1)-1}^{k-2}*f[i][j-1]*(n-j+1) ]

    时间复杂度(O(nk))

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<vector>
    using namespace std;
    #define ll long long
    #define MAX 2010
    #define MOD 1000000007
    void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
    inline int read()
    {
    	int x=0;bool t=false;char ch=getchar();
    	while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    	if(ch=='-')t=true,ch=getchar();
    	while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    	return t?-x:x;
    }
    int n,k,mx,f[MAX][MAX];
    int jc[MAX*MAX],jv[MAX*MAX],inv[MAX*MAX];
    int C(int n,int m){return 1ll*jc[n]*jv[m]%MOD*jv[n-m]%MOD;}
    int main()
    {
    	n=read();k=read();mx=n*k;
    	if(k==1){puts("1");return 0;}
    	jc[0]=jv[0]=inv[0]=inv[1]=1;
    	for(int i=1;i<=mx;++i)jc[i]=1ll*jc[i-1]*i%MOD;
    	for(int i=2;i<=mx;++i)inv[i]=1ll*inv[MOD%i]*(MOD-MOD/i)%MOD;
    	for(int i=1;i<=mx;++i)jv[i]=1ll*jv[i-1]*inv[i]%MOD;
    	f[0][0]=1;
    	for(int i=1;i<=n;++i)
    		for(int j=0;j<=i;++j)
    		{
    			add(f[i][j],f[i-1][j]);
    			if(j)add(f[i][j],1ll*f[i][j-1]*(n-j+1)%MOD*C((n-i)+(n-j+1)*(k-1)-1,k-2)%MOD);
    		}
    	printf("%d
    ",f[n][n]);
    	return 0;
    }
    
  • 相关阅读:
    简单的远程控制软件
    VS集成环境中的JavaScript脚本语法检查
    vs2022安装
    有关httpContext.Current.Session[值] 取值的问题
    【python3.7】文件操作
    148. 排序链表
    11. 盛最多水的容器
    23. 合并K个升序链表
    147. 对链表进行插入排序
    146. LRU 缓存机制
  • 原文地址:https://www.cnblogs.com/cjyyb/p/9705631.html
Copyright © 2011-2022 走看看