题面戳这里

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. JS判断单、多张图片加载完成

    转:http://www.daqianduan.com/6419.html 试想,如果模板中有图片,此时如何判断图片是否加载完成? 在此之前来了解一下jquery的ready与window.onloa ...

  2. 【luogu P1983 车站分级】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1983 符合了NOIP命题的特点,知识点不难,思维量是有的. step1:把题读进去,理解.得到 非停靠点的等 ...

  3. java基础面试题:如何把一段逗号分割的字符串转换成一个数组? String s = "a" +"b" + "c" + "d";生成几个对象?

    package com.swift; public class Douhao_String_Test { public static void main(String[] args) { /* * 如 ...

  4. APCInject

    #include <iostream> #include <Windows.h> #include <TlHelp32.h> using namespace std ...

  5. 【解题报告】AtCoder ABC115 (附英文题目)

    ------------------------------迟到的AK---------------------------------- A - Christmas Eve Eve Eve Time ...

  6. .NET 执行命令行乱码

    Process可以运行命令行内容儿不用担心会弹出命令行窗口 需要读取命令行结果时,如果不注意内容编码,就会出现读取的结果出现乱码 读取StandardOutput结果时需要指定StandardOutp ...

  7. list,tuple,set,dict汇总

      有序/无序 追加/删除元素 元素可/不可重复 元素类型 创建方式 List 有序 可追加删除追加:list.append(item),list.insert(index,item)删除:list. ...

  8. 科学计算库Numpy——数组生成

    等差数组 使用np.arange()或np.linspace()生成元素是等差数列的数组. 以10为底的数组 使用np.logspace()生成元素是以10为底的数组. 数组扩展 使用np.meshg ...

  9. Linux系统软件包之---Apache

    当前互联网主流web服务说明 静态服务: apache 中小型静态web服务的主流,web服务器中的老大哥 nginx 大型新兴网站静态web服务主流,web服务器中的初生牛犊 lighttpd 静态 ...

  10. 线段树[To be continued]

    目录 数据结构--线段树 一.定义 二.性质 三.基本操作 0.结构体 1.建树 2.单点查询 3.单点修改 4.区间修改 5.区间查询 四.题目 单点修改.区域查询模板 五.鸣谢 学姐的Blog 百 ...