退背包进阶,还是挺难想的

/*
dp1[k]表示取到体积k的方案数
dp2[i][j][k]表示左侧必选ij的情况下,取到体积k的方案数
dp2[i][j][k]=dp1[k]-左侧不选ij的方案数
但是这样比较难搞,我们把状态转换一下,dp2[i][j][k]表示左侧不选i,j,取到k的方案数
这样要两层退背包来解决
状态前两维可以直接压缩,用ans[i][j]来保存答案,复杂度O(52*52*n)

*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 200005
#define ll long long
#define mod 1000000007
ll f[maxn],inv[maxn],invf[maxn];
void init(){
f[]=inv[]=invf[]=invf[]=;
for(int i=;i<maxn;i++)
inv[i]=(mod-mod/i)*inv[mod%i]%mod;
for(int i=;i<maxn;i++){
f[i]=f[i-]*i%mod;
invf[i]=invf[i-]*inv[i]%mod;
}
} char s[maxn];
ll cnt[],n,C;
ll dp1[maxn],dp2[maxn],dp3[maxn],ans[][];
void work(){
//先处理背包
dp1[]=;
for(int i=;i<;i++)
if(cnt[i])
for(int j=n/;j>=cnt[i];j--)
dp1[j]=(dp1[j]+dp1[j-cnt[i]])%mod;
for(int i=;i<;i++)
if(cnt[i]){
//先退去一层:没有底i个物品时的状态dp2
memset(dp2,,sizeof dp2);
for(int k=;k<=n/;k++)
if(k<cnt[i]) dp2[k]=dp1[k];
else dp2[k]=(dp1[k]-dp2[k-cnt[i]]+mod)%mod;
ans[i][i]=dp2[n/]; for(int j=;j<;j++)
if(j!=i && cnt[j]){
//再退一层背包
memset(dp3,,sizeof dp3);
for(int k=;k<=n/;k++)
if(k<cnt[j])dp3[k]=dp2[k];
else dp3[k]=(dp2[k]-dp3[k-cnt[j]]+mod)%mod;
ans[i][j]=ans[j][i]=dp3[n/];
}
}
} int main(){
init();
scanf("%s",s);
n=strlen(s);
for(int i=;i<n;i++){
if(s[i]<='Z' && s[i]>='A')
cnt[s[i]-'A']++;
else cnt[s[i]-'a'+]++;
} C=*f[n/]*f[n/]%mod;
for(int i=;i<;i++)
C=C*invf[cnt[i]]%mod; work(); int q;cin>>q;
while(q--){
char a,b;int c,d;
scanf("%d %d",&c,&d);
a=s[c-],b=s[d-];
if(a<='Z' && a>='A')
c=a-'A';
else c=a-'a'+;
if(b<='Z' && b>='A')
d=b-'A';
else d=b-'a'+; cout<<ans[c][d]*C%mod<<'\n';
}
}

01二重退背包+组合数学——cf1111d的更多相关文章

  1. 【Codeforces1111D_CF1111D】Destroy the Colony(退背包_组合数学)

    题目: Codeforces1111D 翻译: [已提交至洛谷CF1111D] 有一个恶棍的聚居地由几个排成一排的洞穴组成,每一个洞穴恰好住着一个恶棍. 每种聚居地的分配方案可以记作一个长为偶数的字符 ...

  2. 01退背包——bzoj2287

    退背包就是限制某一件物品不可取的方案数 先做出无限制的方案数,然后对于当前不可取的物品,dp2[j]表示不取改物品情况下,取得体积为j的方案数 有状态方程 dp2[j]=dp1[j]-dp2[j-w[ ...

  3. 01二维背包+bitset优化——hdu5890

    口胡一种别的解法: 三重退背包,g1[j]k]表示不选x的选了j件物品,体积为k的方案数,g[0][0] = 1 , g1[j][k]=dp[j][k]-g1[j-1][k-a[x]] 然后按这样再退 ...

  4. luogu 4377 Talent show 01分数规划+背包dp

    01分数规划+背包dp 将分式下面的部分向右边挪过去,通过二分答案验证, 注意二分答案中如果验证的mid是int那么l=mid+1,r=mid-1,double类型中r=mid,l=mid; 背包dp ...

  5. BZOJ.2287.[POJ Challenge]消失之物(退背包)

    BZOJ 洛谷 退背包.和原DP的递推一样,再减去一次递推就行了. f[i][j] = f[i-1][j-w[i]] + f[i-1][j] f[i-1][j] = f[i][j] - f[i-1][ ...

  6. Codeforces 1111D(退背包、排列组合)

    要点 优质题解 因为只有某type坏人全部分布在同一撇时,才能一次消灭.所以题目安排完毕后一定是type(x)和type(y)占一半,其余占另一半. 实际情况只有52*52种,则预处理答案 枚举某两种 ...

  7. Codeforces1111D Destroy the Colony 退背包+组合数

    Codeforces1111D 退背包+组合数 D. Destroy the Colony Description: There is a colony of villains with severa ...

  8. 01二维背包——poj2576

    /* 要求把a数组分成两个集合,两个集合人数最多差1,并且元素之和的差尽可能小 那只要把所有可行的列出来即可 01二维背包,即体积是个二维数据,那么我们的背包状态也应该设为二维 dp[j][k]设为 ...

  9. Codeforces 1111D Destroy the Colony 退背包 (看题解)

    第一次知道这种背包还能退的.... 我们用dp[ i ]表示选取若干个物品重量到达 i 的方案数. 如果我们g[ i ]表示不用第 x 个物品的, 然后选若干其他的物品到达 i 的方案数. if(i ...

随机推荐

  1. python 对列表中任意两个数进行操作 (python operate any two elements in list)

    python中, 实现列表中的整型元素两两相乘或列表中的数组元素两两相与 1. 假设列表中的元素是整型, 可调用以下函数: def list_any_two_mul(mylist):      num ...

  2. kubeadm部署k8s集群

    kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具. 这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Master 节点 kubeadm ini ...

  3. 前端避免XSS(跨站脚本攻击)

    尽量或禁止使用危险的脚本. 示例1: 如:eval() eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码.

  4. 关键字this super final static

    this关键字 1.this代表通过当前类实例化成的对象. 2.通过this来获取当前类的属性和方法 3.通过this和区分成员变量和局部变量 4.通过this(参数),调用当前类的构造方法 注意:通 ...

  5. Unity Log Path

    { //不是开场动画的LOG,是APK的 C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Apk\res\mipmap ...

  6. 莫队算法 sqrt(n)分块思想

    在此说一下本渣对莫队算法思想的一些浅薄理解 莫队算法的思想就是对真个区间的分块,然后按照每块来分别进行计算,这样最终的复杂度可以达到n*sqrt(n) 小Z的袜子是一道非常经典的题目.:题目链接htt ...

  7. JCF——工具类

  8. 线性dp——1197D

    一开始没有什么头绪,后来注意到m<=10,考虑是否可以用dp[i][j]表示第i位,前面跟了j个数的最大值 那么第i+1个数,直接和第i个数的[0,m]的m+1种状态去转移即可,如果是由0或m状 ...

  9. Hbase集群类型|集群配置|服务器选型|磁盘容量规划

    HBase和Hadoop的集群类型 1.单机模式 主要用于开发工作,一台机器上运行所有的守护进程,或者一台机器运行多个虚拟机.一般用于评估和测试. 2.小型集群 20台机器以内的集群,不同的机器运行不 ...

  10. robotium学习

    20140424 控件种类:spinner:下拉菜单,可以选择:TabHost:可以左右滑动,比如电话本:Gallery:rogressbar进度条;DatePicker;CheckBox,Radio ...