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

/*
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. linux crontab 计划任务脚本

    在LINUX中你应该先输入crontab -e,然后就会有个vi编辑界面,再输入0 3 * * 1 /clearigame2内容到里面 :wq 保存退出. 在LINUX中,周期执行的任务一般由cron ...

  2. vue中的$nextTick的常用思路

    Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新. $nextTick 是在下次 DOM 更新循环结束之后执行延迟回调,在修改数据之后使用 $nextT ...

  3. 管理员技术(三): 配置静态网络地址、 使用yum软件源 、 升级Linux内核、查找并处理文件、查找并提取文件内容

    一. 配置静态网络地址 目标: 本例要求为虚拟机 server 配置以下静态地址参数: 1> 主机名:server0.example.com    2> IP地址:172.25.0.11  ...

  4. AcWing 144. 最长异或值路径 01字典树打卡

    给定一个树,树上的边都具有权值. 树中一条路径的异或长度被定义为路径上所有边的权值的异或和: ⊕ 为异或符号. 给定上述的具有n个节点的树,你能找到异或长度最大的路径吗? 输入格式 第一行包含整数n, ...

  5. Python 内置模块:os模块

    Python os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.(一语中的) 二.常用方法 1.os.name 输出字符串指示正在使用的平台.如果是windo ...

  6. VC内联汇编,引用程序中的变量

    int a=5; //变量a _asm { mov eax,a;       //将变量a的值放入寄存器eax add eax,eax;   //相当于a=a+a mov a,eax;      // ...

  7. 杂项-笔记-VS:VS2019笔记

    ylbtech-杂项-笔记-VS:VS2019笔记 1.返回顶部 1. http://www.ddooo.com/softdown/142335.htm 2. 2.返回顶部   3.返回顶部   4. ...

  8. flask json

    导入 from flask import Flask,jsonify 1.列表 def index(): arr=['mkdir','md','touch'] return jsonify(arr) ...

  9. Django+paramiko实现webshell

    说明 基于 python3.7 + django 2.2.3 实现的 django-webshell,支持颜色显示,支持 tab 命令补全,项目地址:https://github.com/leffss ...

  10. Maven项目上有小红叉咋办

    Maven项目上有小红叉咋办 创建maven项目之后,war工程如果目录不全的话会出现错误.这种情况就是把目录补全就可以了. 这种情况版本问题,点击那个最新版本的,会自动给加一段代码.(如果没有就自己 ...