【Java】【滚动数组】【动态规划】UVA - 11137 - Ingenuous Cubrency

滚动数组优化自己画一下就明白了。

http://blog.csdn.net/u014800748/article/details/45849217

解题思路:本题利用递推关系解决。建立一个多段图,定义状态d(i,j)表示“使用不超过i的整数的立方,累加和为j”的方案数。那么根据加法原理,如果没有选择数字i的立方和就得到了j,那么方案数就是d(i-1,j);如果选择了数字i的立方和才得到了j,那么方案数是d(i,j-i^3)。即:

d(i,j)=d(i-1,j)+d(i,j-i^3);

这个递推式还可以降低维度,利用滚动数组计算。由递推式可知,i,j都需要从小到大计算,而更新i的时候,d(j)保存的是第i-1次计算时的结果,此时可以用d(j)更新d(j+i^3)的状态。即只需要d(j+i^3)+=d(j)即可完成上述方程的计算。

import java.util.*;
import java.io.*;
import java.math.*;

public class Main{
	static long[] f=new long[10010];
	public static void main(String[] argc){
		Scanner sc = new Scanner (new BufferedInputStream(System.in));
		f[0]=1l;
		for(int i=1;i<=21;++i){
			for(int j=0;j<=10000;++j){
				if(j+i*i*i<=10000){
					f[j+i*i*i]+=f[j];
				}
			}
		}
		while(sc.hasNext()){
			int n=sc.nextInt();
			System.out.println(f[n]);
		}
		sc.close();
    }
}
时间: 2024-11-13 16:44:45

【Java】【滚动数组】【动态规划】UVA - 11137 - Ingenuous Cubrency的相关文章

uva 11137 Ingenuous Cubrency (完全背包)

uva 11137 Ingenuous Cubrency People in Cubeland use cubic coins. Not only the unit of currency is called a cube but also the coins are shaped like cubes and their values are cubes. Coins with values of all cubic numbers up to 9261 (= 21 3), i.e., coi

UVA - 11137 Ingenuous Cubrency[背包DP]

People in Cubeland use cubic coins. Not only the unit of currency iscalled a cube but also the coins are shaped like cubes and their valuesare cubes. Coins with values of all cubic numbers up to 9261(= 213),i.e., coins with the denominations of 1, 8,

UVa 11137 - Ingenuous Cubrency

题目:统计一个数字可以有多少种立方和的表示方式. 分析:dp,完全背包.又见整数拆分. 说明:csdn冲进前1000了,(*^__^*) 嘻嘻--. #include <iostream> #include <cstdlib> #include <cstring> using namespace std; int cube[25]; long long F[10001]; int main() { for (int i = 0 ; i <= 21 ; ++ i)

【UVA】11137-Ingenuous Cubrency

DP问题,须要打表. dp[i][j]代表利用大小不超过i的数字组成j的方法. 状态方程是 dp[i][j] = d[i - 1][j] + sum{dp[i - 1][j - k * i * i *i]}; 14327705 11137 Ingenuous Cubrency Accepted C++ 0.049 2014-10-09 10:20:48 #include<cstdio> #include<cstring> #include<algorithm> #inc

UVa 11137 (完全背包方案数) Ingenuous Cubrency

题意:用13.23……k3这些数加起来组成n,输出总方案数 d(i, j)表示前i个数构成j的方案数则有 d(i, j) = d(i-1, j) + d(i, j - i3) 可以像01背包那样用滚动数组来实现 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 using namespace std; 6 7 const int maxn = 10; 8

动态规划算法之滚动数组的求解(C++)

虽然接触动态规划算法已经有一段时间,给一个01背包问题,能够做到一个表格简单粗暴下去,然后求得结果,但心里总觉得对这个算法理解十分不到位,抱着对算法的热爱,网上很多大牛的算法思维实在让我佩服的五体投地.在此讲一讲动态规划中滚动数组的求解方法,算是对这个知识点做一个记录,也希望有写的不妥的地方,大家能不吝赐教. 首先,我们先看看"滚动数组"的例题,大家可以参考http://www.lintcode.com/en/problem/house-robber/ 题意大概就是说:一个盗贼要去偷盗

POJ2442——Squence(二叉堆+动态规划 | 滚动数组)

本文出自:http://blog.csdn.net/svitter 题意分析: Given m sequences, each contains n non-negative integer. Now we may select one number from each sequence to form a sequence with m integers. It's clear that we may get n ^ m this kind of sequences. Then we can

动态规划+滚动数组 -- POJ 1159 Palindrome

给一字符串,问最少加几个字符可以让它成为回文串, 比如 Ab3bd 最少需要两个字符可以成为回文串 dAb3bAd 思路: 动态规划 DP[i][j] 意味着从 i 到 j 这段字符变为回文串最少要几个字符,枚举子串长. if str[i] == str[j]: DP[i][j] = DP[i + 1][j - 1] else: DP[i][j] = min( DP[i + 1][j], DP[i][j - 1] ) + 1 注意: 长度较大为 5000,二维数组 5000 * 5000 需要将

【动态规划】【滚动数组】【bitset】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem J. Terminal

有两辆车,容量都为K,有n(10w)个人被划分成m(2k)组,依次上车,每个人上车花一秒.每一组的人都要上同一辆车,一辆车的等待时间是其停留时间*其载的人数,问最小的两辆车的总等待时间. 是f(i,j)表示前i组,j个人是否可行.w(i)表示第i组的人数. if f(i,j)==1 then f(i+1,j+w(i+1))=1. 这是个bitset可以做的事情,每次左移以后或上f(i-1)的bitset即可.其实可以滚动数组. 然后每更新一次bitset,求一下其最左侧的1的位置,就是对于第一辆