动态规划(分割整数)---按平方数分割整数

最长递增子序列

??已知一个序列 {S1, S2,...,Sn},取出若干数组成新的序列 {Si1, Si2,..., Sim},其中 i1、i2 ... im 保持递增,即新序列中各个数仍然保持原数列中的先后顺序,称新序列为原序列的一个 子序列

??如果在子序列中,当下标 ix > iy 时,Six > Siy,称子序列为原序列的一个 递增子序列

??定义一个数组 dp 存储最长递增子序列的长度,dp[n] 表示以 Sn 结尾的序列的最长递增子序列长度。对于一个递增子序列 {Si1, Si2,...,Sim},如果 im < n 并且 Sim < Sn,此时 {Si1, Si2,..., Sim, Sn} 为一个递增子序列,递增子序列的长度增加 1。满足上述条件的递增子序列中,长度最长的那个递增子序列就是要找的,在长度最长的递增子序列上加上 Sn 就构成了以 Sn 为结尾的最长递增子序列。因此 dp[n] = max{ dp[i]+1 | Si < Sn && i < n} 。

??因为在求 dp[n] 时可能无法找到一个满足条件的递增子序列,此时 {Sn} 就构成了递增子序列,需要对前面的求解方程做修改,令 dp[n] 最小为 1,即:

??dp[n]=max{1,dp[i]+1|Si<Sn&&i<n}

??对于一个长度为N的序列,最长递增子序列不一定会以Sn为结尾,因此dp[N]不是序列的最长递增子序列的长度,需要遍历dp数组找出最大值才是所要的结果。

原文地址:https://www.cnblogs.com/yjxyy/p/11118981.html

时间: 2024-10-21 08:26:34

动态规划(分割整数)---按平方数分割整数的相关文章

判断一个整数是否是平方数

367. Valid Perfect Square 题意:不用api,判断一个整数是否是平方数. 开始的想法是直接用二分法判断是否是平方数. 错误的代码: 1 public boolean isPerfectSquare(int num) { 2 // binary search 3 int i=0; 4 int n=num; 5 while(i<=n){ 6 int mid=i+(n-i)/2; 7 int square=mid*mid; 8 if(square==num) return tr

输入一个浮点数,并输出该数的整数部分和小数部分

package javaapplication29; import java.util.Scanner;import java.util.StringTokenizer; /** * * @author qingzhu */public class JavaApplication29 { /** * @param args the command line arguments */ public static void main(String[] args) { String[] mess={"

给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。

一.题目: n给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. n要求: n写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数.例如 f(12)  = 5. n在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少. 二.解题思路: 无. 三.程序源码: import java.util.*; public class main { public static void main(String[] args) { // TODO Au

(c语法百题7)求两数的整数商 和 余数

知识点: 求商和求余 /   和 % 的用法. 注意 /  中,两个%d的值为整数,即取整.有%f类的,就是商了,带小数的. 内容: 求两数的整数商 和 余数 输入说明: 一行两个整数 输出说明: 一行两个整数 输入样例: 若题目没有特别说明,则应该以多组测试数据方式读取,或者参考a001. 18 4 输出样例 : 4 2 #include <stdio.h> int main() { int a,b; scanf("%d %d",&a,&b); print

(c语法百题8)求两数的整数商 和 商

内容: 求两数的整数商 和 商 ,商保留两位小数 输入说明: 一行 两个整数 输出说明: 一行,一个整数,一个实数(两位小数) 输入样例: 若题目没有特别说明,则应该以多组测试数据方式读取,或者参考a001. 12 8 输出样例 : 1 1.50 #include <stdio.h> int main() { int a,b; scanf("%d %d",&a,&b); printf("%d %.2f\n",a/b,a/(1.0*b));

课堂练习:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。

一.题目 1 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 2 要求: (1) 写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数.例如 f(12)  = 5. (2)在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少. 二.设计思想 (1)一位数时 f(0)=0;f(1)=1;f(2-9)=1; (2)二位数时 f(10)=1+(0+1)=2; f(11)=(1+1)+(1+1)=4; f(12)=(1+1)+(2+1)=5;

动态规划的思想来求解字符串分割问题

LeetCode WordBreak原题 Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words. For example, given s = "leetcode", dict = ["leet", "code"]

【任意输入一串整数输出该数的位数】新手每天学写C程序(1)

#include"stdio.h" int main() { int a; int n=0; scanf("%d",&a); n++; a=a/10; while(a>0) { n++; a=a/10; } printf("%d",n); return 0; } [任意输入一串整数输出该数的位数]新手每天学写C程序(1)

【算法】将正整数表示为平方数之和

问题来源 Timus Online Judge 网站上有这么一道题目:1073. Square Country.这道题目的输入是一个不大于 60,000 的正整数,要求计算出该正整数最少能够使用多少个正整数的平方和来表示.这道题目的时间限制是 1 秒. 问题解答 <数论导引(第5版)>([英]G.H.Hardy.E.M.Wright 著,人民邮电出版社,2008年10月第1版)第 320 页有以下定理: 定理 369(Lagrange 定理): 每个正整数都是四个平方数之和 在这个定理中,平方