Vijos 1060 盒子(DP)
来源:互联网 发布:淘宝保健品代理 编辑:程序博客网 时间:2024/06/05 22:50
【问题描述】
n 个盒子排成一行(编号为1..n)。你有A个红球和B个蓝球。球除了颜色没有任何区别。你可以将球放进盒子。一个盒子可以同时放进两种球,也可以只放一种,也可以空着。球不必全部放入盒子中。编程计算有多少种放置球的方法。
【输入格式】
一行,n,A,B,用空格分开。
【输出格式】
一行,输出放置方案总数。
【输入样例】
2 1 1
【输出样例】
9
【样例解释】
用一对括号表示一个盒子,R表示红色,B表示蓝色,有如下9种方案:
( ), ( )
(R ), ( )
(B ), ( )
(RB), ( )
(R ), (B )
(B ), (R )
( ), (R )
( ), (B )
( ), (RB)
【数据范围】
1<=n<=20 , 0<=A<=15, 0<=B<=15
这道题计算多少种放置球的方法,一个盒子里可以放多个球。可以设状态函数f(i,j,k)代表前i个箱子里放j个红球,k个蓝球的方案数。此时的方程f(i,j,k)=
如果要优化,可以设状态函数f(i,j)代表前i个箱子里放j个蓝球或红球的方案数,把蓝球和红球单独放,方程为f(i,j)=
如果只用两重循环,可以把t初始化放在循环外,每次循环j时t累加一边f(i-1,j),最后f(i,j)转存t。时间复杂度为(max(a,b)*n)。
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int a,b,n;unsigned long long d[22][22];//f(i,j)前i个箱子装只放红球或蓝球不超过j球的方案数//f(i,j)=f(i-1,0)+f(i-1,k) 0<=k<=a||k<=b;int main(){ //freopen("box.in","r",stdin); scanf("%d %d %d",&n,&a,&b); memset(d,0,sizeof(d)); for(int i=0;i<=n;i++) { d[i][0]=1; } for(int i=1;i<=a||i<=b;i++) { d[0][i]=1; } for(int i=1;i<=n;i++) { for(int j=0;j<=a||j<=b;j++) { unsigned long long t=0; for(int k=0;k<=j;k++) { t+=d[i-1][k]; } d[i][j]=t; } } printf("%I64u",(unsigned long long)d[n][a]*d[n][b]);}
- Vijos 1060 盒子(DP)
- 【Vijos-P1060】盒子-DP+组合数学
- Vijos P1060 盒子
- #Vijos P1060#盒子
- vijos 1100(树状dp)
- Vijos P1987 游戏(DP)
- Vijos p1002 过河 (DP+状态压缩)
- vijos 1680 P1680 距离 ( 线性dp )
- VIJOS-P1144 小胖守皇宫(树形dp)
- vijos搭建双塔(dp)
- vijos p1002 过河(离散化dp)
- 集训-vijos选课(树形DP)
- Vijos P1100 加分二叉树(区间DP,树形DP)
- vijos 1069 区间DP
- vijos 1014 DP
- vijos 1002 DP
- vijos 1193 dp
- vijos p1144(树形dp)
- LintCode做题记录-两数组的交 II
- LintCode_168 Burst Balloons
- C#入门6.8——字符串的合并
- 通过cmd将文件夹的隐藏
- 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。 虽然使用其他方法也可以对外共享数
- Vijos 1060 盒子(DP)
- LintCode做题记录- 数字三角形
- Eclipse修改编码格式
- Android强制设置横屏或竖屏
- MyEclipse2014的若干问题-乱码解决方案
- openCV中convertTo的用法
- adb模拟按键
- RoR创建项目流程
- 测试工具的选择和使用