【上海交大oj】赫萝的桃子(动态规划)

1370. 赫萝的桃子

Description

赫萝最喜欢吃蜂蜜腌渍的桃子。然而她能够得到的桃子有限,因此赫萝必须精打细算。赫萝在b天内可以得到a个桃子,每天赫萝至少吃一个桃子,她想知道她在a天内有多少种吃桃子的方法。吃桃子的顺序并不重要,也就是说赫萝认为“第一天吃一个桃子第二天吃两个桃子”和“第一天吃两个桃子第二天吃一个桃子”算一种方法。

Input Format

每个测试点有多组测试数据。

第一行一个数n,表示测试的数量。

接下来n行每行两个数a, b(a>b)。

Output Format

输出n行,每行一个数,表示方法数量。

Sample Input

2
7 3
6 2

Sample Output

4
3

HINTS AND LIMITS

对于70%的数据,a≤60,b≤15 。

对于100%的数据,a≤160,b≤40。

提示:可以用递归或者动态规划解决,答案保证在int范围内。

刚开始一直想着找公式,但是失败了,主要就是吃桃子是没有顺序的。然后想动态规划,但是没想到状态转移方程,就是因为不懂如何解决重复计算的问题,看了别人的解法才豁然开朗。具体就是开一个二维数组,储存m天吃n个桃子的种类数,然后动归。考虑时实际只需要分两类,一种是吃法中至少有一天只吃一个桃子,实际上就是ways【m-1][n-1]的个数,因为即使是其它天吃一个桃子也是可以转化为第m天吃一个,因此等效的。还有一类就是每天吃的桃子个数都大于1个,那么就是ways[m][n-m],相当于所有每天吃的桃子都减一时的个数,这样就可以动态规划了。

代码:

 1 #include <iostream>
 2 using namespace std;
 3
 4 int main(){
 5     int n,a,b;
 6
 7     cin>>n;
 8     for (int k=0;k<n;++k){
 9         cin>>a>>b;
10         int ways[b+1][a+1];
11         //预处理
12         for (int i = 1;i <= b;i++) {
13             for (int j = 1;j < i;++j) ways[i][j] = 0;
14             ways[i][i] = 1;
15         }
16         for (int i = 1;i <= a;++i) ways[1][i] = 1;
17
18         for (int i = 2;i <= b;++i) {
19             for (int j = i+1;j <= a;++j){
20                 ways[i][j] = ways[i-1][j-1] + ways[i][j-i];
21             }
22         }
23         cout<<ways[b][a]<<endl;
24     }
25
26     return 0;
27 }

时间: 2024-10-14 13:01:02

【上海交大oj】赫萝的桃子(动态规划)的相关文章

【算法学习笔记】60.经典动态规划 SJTU OJ 1370 赫萝的桃子

Description 赫萝最喜欢吃蜂蜜腌渍的桃子.然而她能够得到的桃子有限,因此赫萝必须精打细算.赫萝在b天内可以得到a个桃子,每天赫萝至少吃一个桃子,她想知道她在a天内有多少种吃桃子的方法.吃桃子的顺序并不重要,也就是说赫萝认为“第一天吃一个桃子第二天吃两个桃子”和“第一天吃两个桃子第二天吃一个桃子”算一种方法. Input Format 每个测试点有多组测试数据. 第一行一个数n,表示测试的数量. 接下来n行每行两个数a, b(a>b). Output Format 输出n行,每行一个数,

nyist oj 37 回文字符串 (动态规划经典)

回文字符串 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串.现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串. 输入 第一行给出整数N(0<N<100) 接下来的N行,每行一个字符串,每个字符串长度不超过1000. 输出 每行输出所需添加的最少字符

nyist oj 311 完全背包 (动态规划经典题)

完全背包 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 直接说题意,完全背包定义有N种物品和一个容量为V的背包,每种物品都有无限件可用.第i种物品的体积是c,价值是w.求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大.本题要求是背包恰好装满背包时,求出最大价值总和是多少.如果不能恰好装满背包,输出NO 输入 第一行: N 表示有多少组测试数据(N<7). 接下来每组测试数据的第一行有两个整数M,V. M表示物品种类的数目,V表示背包的总容

【上海交大oj】能量项链(动态规划)

1073. 能量项链 Description 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定等于后一颗珠子的头标记.因为只有这样,通过吸盘(吸盘是Mars人吸收能量的一种器官)的作用,这两颗珠子才能聚合成一颗珠子,同时释放出可以被吸盘吸收的能量.如果前一颗能量珠的头标记为m,尾标记为r,后一颗能量珠的头标记为r,尾标记为n,则聚合后释放的能量为m×r×n

nyist oj 311 全然背包 (动态规划经典题)

全然背包 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描写叙述 直接说题意,全然背包定义有N种物品和一个容量为V的背包.每种物品都有无限件可用.第i种物品的体积是c,价值是w. 求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大.本题要求是背包恰好装满背包时,求出最大价值总和是多少. 假设不能恰好装满背包,输出NO 输入 第一行: N 表示有多少组測试数据(N<7). 接下来每组測试数据的第一行有两个整数M.V. M表示物品种类的数目,V表示背

【上海交大oj】畅畅的牙签袋(状态压缩dp)

1383. 畅畅的牙签袋 题目描述 畅畅说:“你们都说窝脑子瓦特了,我看你们才是脑子瓦特嘞- -” 为了阻挠我们再次揭露他的无chǐ,畅畅妄图破坏我们的显示器,他拿出了自己收集的牙签包装袋,其大小是1×2的矩形,他想用密铺的方式把显示器全部遮挡住.显示器大小是W×H的矩形,畅畅把包装袋背面涂上了胶水,开始一块一块粘到显示器上,要求不能有包装袋重叠,也不能有显示器的某一部分没被遮挡,包装袋的放置只有两种情况:横放和竖放. 畅畅为自己的周密计划洋洋得意之时,脑子又瓦特了,他想让你帮他算算针对每台显示

nyist oj 171 聪明的kk (动态规划)

聪明的kk 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 聪明的"KK" 非洲某国展馆的设计灵感源于富有传奇色彩的沙漠中陡然起伏的沙丘,体现出本国不断变换和绚丽多彩的自然风光与城市风貌.展馆由五部分组成,馆内影院播放名为<一眨眼的瞬间>的宽银幕短片,反映了建国以来人民生活水平和城市居住环境的惊人巨变. 可移动"沙丘"变戏法 的灵感源于其独特而雄伟的自然景观--富于传奇色彩的险峻沙丘.宏伟的结构.可循环的建材,与大自然相得益

【上海交大oj】邮递员小F(状态压缩dp)(旅行商问题)

1088. 邮递员小F Description 因为制造类专业很难在大城市立足,曾经立志振兴中华之工业的小F,果断在本科毕业后转行做了一名光荣的邮递员. 他的任务是每天从总局出发,行走于所管辖区域的若干的邮局,收集所有的信,然后再汇总返回总局. 因为工作繁忙,同一个邮局他每天只希望去一次. 来往于任意两个邮局是有一定代价的.而且为了方便统计,假定来回两条道路上的代价假设是一样的. 现在小F希望你能给出他每天的最优行走方案,使得总的代价最少. Input Format 输入数据包括两部分. 第一行

[Swust OJ 404]--最小代价树(动态规划)

题目链接:http://acm.swust.edu.cn/problem/code/745255/ Time limit(ms): 1000 Memory limit(kb): 65535 Description 以下方法称为最小代价的字母树:给定一正整数序列,例如:4,1,2,3,在不改变数的位置的条件下把它们相加,并且用括号来标记每一次加法所得到的和. 例如:((4+1)+ (2+3))=((5)+(5))=10.除去原数不4,1,2,3之外,其余都为中间结果,如5,5,10,将中间结果相加