题面戳这里

dp的姿势有两种(都保证了拆分的有序):

  1. \(f_{i,j}\)表示拆分中最大数为\(j\),和为\(i\)的方案数。转移$$f_{i,j} = \sum_{k = 1}^j f_{i-j,k}$$

    然后可以用前缀和优化一下。复杂度\(O(N^2)\)
  2. \(f_{i,j}\)表示和为\(i\),拆分为\(j\)个数的方案数。转移这样考虑,要么在拆分方案中增加\(1\),要么把拆分中所有数增加\(1\)。方程如下

\[f_{i,j} = f_{i-1,j-1}+f_{i-j,j}
\]

然后由于这题数据范围比较大,我们需要滚动数组。其实有时第二维也可以滚动(将dp方程反过来看就行了)

import java.util.Scanner;
import java.math.BigInteger; public class Main{
static int maxn = 5010,N;
static BigInteger f[][] = new BigInteger[2][maxn];
static BigInteger ans[] = new BigInteger[maxn]; public static void ready()
{
for (int j = 0;j < maxn;++j) f[0][j] = BigInteger.ZERO; ans[0] = f[0][0] = BigInteger.ONE;
for (int j = 1;j <= 5000;++j)
{
int p = j&1,q = p^1;
f[p][0] = BigInteger.ONE;
for (int i = 1;i <= 5000;++i)
{
f[p][i] = f[q][i];
if (i-j >= 0) f[p][i] = f[p][i].add(f[p][i-j]);
}
ans[j] = f[p][j];
}
} public static void main(String args[])
{
ready();
Scanner in = new Scanner(System.in);
while (in.hasNextInt())
{
N = in.nextInt();
System.out.println(ans[N]);
}
}
}

Uva 10590 Boxes of Chocolates Again的更多相关文章

  1. UVa 12525 Boxes and Stones (dp 博弈)

    Boxes and Stones Paul and Carole like to play a game with S stones and B boxes numbered from 1 to B. ...

  2. UVa 12657 Boxes in a Line(应用双链表)

    Boxes in a Line You have n boxes in a line on the table numbered 1 . . . n from left to right. Your ...

  3. UVA 12657 Boxes in a Line 双向链表

    题目连接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=47066 利用链表换位置时间复杂度为1的优越性,同时也考虑到使用实际 ...

  4. UVA 12657 Boxes in a Line

    双向链表 注意:如果算法是最后处理翻转情况时,注意指令4翻转后1,2两个指令也要翻转处理: 指令3 中交换盒子要注意两个盒子相邻的情况 #include <iostream> #inclu ...

  5. UVa 12657 Boxes in a Line(数组模拟双链表)

    题目链接 /* 问题 将一排盒子经过一系列的操作后,计算并输出奇数位置上的盒子标号之和 解题思路 由于数据范围很大,直接数组模拟会超时,所以采用数组模拟的链表,left[i]和right[i]分别表示 ...

  6. UVA10590 Boxes of Chocolates Again

    题意 将正整数N拆分成若干个正整数之和,问有多少种不重复的拆分方案. \(n \leq 5000\) 分析 用f(i,j)表示将i拆成若干个数字,最大的那个数字(即最后一个数)不超过j的方案数. 转移 ...

  7. UVA 12657 Boxes in a Line(双向链表+小技巧)

    题意:对于一行按照顺序排列盒子数字与位置都为 1,2,3,4....n 执行四种操作 c = 1    x 放到 y 的左边 c =2     x 放到 y 的右边 c =3 交换 x, y c =4 ...

  8. ACM - 动态规划专题 题目整理

    CodeForces 429B  Working out 预处理出从四个顶点到某个位置的最大权值,再枚举相遇点,相遇的时候只有两种情况,取最优解即可. #include<iostream> ...

  9. UVa 103 - Stacking Boxes(dp求解)

    题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...

随机推荐

  1. cf1151 B

    题目连接 : https://codeforces.com/contest/1151/problem/B 可能我想法有问题,我怎么感觉B题的思路不直接想出来的,我想了一会才想出来,感觉不难,但可能有更 ...

  2. java 如何使的float保留2位或者多位小数

    方法1: float   f   =  34.232323;     BigDecimal   b  =   new  BigDecimal(f);     float   f1   =  b.set ...

  3. cf550C. Divisibility by Eight(结论)

    题意 给出长度为$n$的字符串,判断是否能删除一些数后被$8$整除 Sol 神仙题啊Orz 结论: 若数字的后三位能被$8$整除,则该数字能被$8$整除 证明 设$x = 10000 * a_i + ...

  4. SpringBoot之自动配置原理

    我在前面的Helloworld的程序中已经分析过一次,配置原理了: 1).SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration 2).@En ...

  5. ajaxfileuplod 上传文件 essyui laoding 效果,防止重复上传文件

    //放于上传前 function ajaxLoading(){ $("<div class=\"datagrid-mask\"></div>&qu ...

  6. mysql基础,事物

  7. 项目10.2-企业级自动化运维工具---puppet详解

    1.认识puppet 1.1 引入 puppet是什么,咱们先不用专业的名词解释它,咱们先描述一些工作场景,看明白这些工作场景,自然会知道puppet是什么. (1)场景一: 管理员想要在100台服务 ...

  8. 九、Linux 磁盘管理

    Linux 磁盘管理 Linux磁盘管理好坏直接关系到整个系统的性能问题. Linux磁盘管理常用三个命令为df.du和fdisk. df:列出文件系统的整体磁盘使用量 du:检查磁盘空间使用量 fd ...

  9. 背景透明度处理 兼容IE

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 使用shell脚本添加用户

    该文演示如何使用shell脚本完成添加用户,首先进行一个判断,如果用户存在,提示该用户已经存在,否则进行添加新的用户. 示例代码如下: #!/bin/bash grep_user() { R=`gre ...