zoukankan      html  css  js  c++  java
  • 【简单dp】ARC059C キャンディーとN人の子供 / Children and Candies

    题目链接

    这道题还是比较简单的,(主要问题在于读题)但是鉴于我自己没有很顺畅地做出来,所以记录一下。

    注意到有个(A_i=B_i)的部分分,先考虑这个部分分怎么做。

    可以定义(dp[i][j])表示前(i)个小朋友一共分了(j)颗糖的答案。

    考虑转移:(dp[i][j]=sum (dp[i-1][j-k] imes x_i^k))

    然后考虑扩展到更普遍的情况。

    (dp[i][j]=sum(dp[i-1][j-k] imes sum_{x_m=A_i}^{x_mleq B_i} x_m^k))

    这样直接做是(O(n^4))的,但是(sum_{x_m=A_i}^{x_mleq B_i} x_m^k))是一个常数,不需要每次计算,可以预处理,复杂度降到(O(n^3)),可接受

    注意理解一下加乘之间的关系(分步、分类),相互之间有替代关系的就是加法,不同部分之间就是乘法,不要搞混了。


    ►Code View

    #include<cstdio>
    #include<algorithm>
    #include<queue>
    #include<cstring>
    #include<string>
    #include<map>
    #include<cmath>
    using namespace std;
    #define N 405
    #define MOD 1000000007
    #define LL long long
    int rd()
    {
    	int x=0,f=1;char c=getchar();
    	while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}
    	while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48); c=getchar();}
    	return f*x;
    }
    int n,c;
    int a[N],b[N];
    LL dp[N][N];//dp[i][j]表示前i个小朋友得到了j颗糖的答案 
    //dp[i][j]+=dp[i-1][j-k]*sum(xi^k)
    LL sum[N][N];//sum[i][j]表示第i个小朋友的j次方的前缀和 
    LL ksm(LL a,LL b)
    {
    	LL res=1;
    	while(b)
    	{
    		if(b&1) res=res*a%MOD;
    		a=a*a%MOD;
    		b>>=1;
    	}
    	return res;
    }
    void Init()
    {
    	for(int i=1;i<=n;i++)
    		sum[i][0]=b[i]-a[i]+1;
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=c;j++)
    			for(int k=a[i];k<=b[i];k++)
    				sum[i][j]=(sum[i][j]+ksm(k,j))%MOD;
    }
    int main()
    {
    	n=rd(),c=rd();
    	for(int i=1;i<=n;i++)
    		a[i]=rd();
    	for(int i=1;i<=n;i++)
    		b[i]=rd();
    	Init();
    	dp[0][0]=1;
    	for(int i=1;i<=n;i++)
    	{
    		dp[i][0]=dp[i-1][0]*sum[i][0]%MOD;
    		for(int j=1;j<=c;j++)
    			for(int k=0;k<=j;k++)
    				dp[i][j]=(dp[i][j]+dp[i-1][j-k]*sum[i][k]%MOD)%MOD;
    	}
    	printf("%lld
    ",dp[n][c]);
        return 0;
    }
    
  • 相关阅读:
    js自定义回调函数
    python:sql建表语句转换为json
    简单list转化为tree结构
    JSP中页面定时刷新
    struts2中<s:select/>标签的运用详解
    Redis 的 Sentinel
    redis持久化(persistence)
    java验证身份证合理性
    js 里面的键盘事件对应的键码
    Struts2中使用OGNL表达式语言访问静态方法和静态属性
  • 原文地址:https://www.cnblogs.com/lyttt/p/13863689.html
Copyright © 2011-2022 走看看