11088 整数划分的扩展问题
11088 整数划分的扩展问题
10344矩阵连乘积的加括号方式数
10344矩阵连乘积的加括号方式数
操作系统精髓与设计原理课后答案
操作系统精髓与设计原理课后答案,只有复习题答案,没有习题答案
最长上升子序列
问题描述
一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8).
你的任务,就是对于给定的序列,求出最长上升子序列的长度。
输入样例
7
1 7 3 5 9 4 8
6
1 8 3 6 5 9
5
1 2 3 4 5
0
输出样例
4
4
5
提示
一,对输入字符串的处理
注意:这道题和其他题的输入输出不同,这题是接收多组数据而非单组,以0来判别结束。
大家在接受数据的时候,不要用(c=getchar())!='\n'诸如此类一个字符一个字符接受,
然后判断是否是回车符号来结束一行的输入,这样的方式在你本机运行不会有问题,
但OJ系统中会有错误,无法输出结果,因为测试平台行末并非'\n'字符。
这里接受数据用scanf的%d或%s,或cin等,会自动判别结束字符的,你就不要在你程序
里专门去判别或吸收回车字符。
对于最后一组数据输入为0表示结束,只要判断接受的第一个字符是否为0且字
符串长度为1就结束,无须去处理回车字符。
输入的序列可以用整型数组或字符串数组保存。
整数因子分解
Description 大于1的正整数 n 都可以分解为 n = x1 * x2 * ... * xm, 每个xi为大于1的因子,即1<xi<=n 。
例如:当n=12时,共有8种不同的分解式:
12 = 12
12 = 6*2
12 = 4*3
12 = 3*4
12 = 3*2*2
12 = 2*6
12 = 2*3*2
12 = 2*2*3
对于给定正整数n,计算n共有多少种不同的分解式。
输入格式 第一行一个正整数n (1<=n<=1000000)
输出格式 不同的分解式数目
输入样例 12
输出样例 8
提示
此题因子讲顺序的.第一个因子可能是2~n之间的数.
比如对12而言,第一个因子可能是2,3,4,6,12.
将第一个因子为2的分解个数,加上第一个因子为3的分解个数,...,直至加到第一个因子为12的分解个数.
而第一个因子为2的分解个数又是多少呢?是6(因为12/2=6)的分解个数,递归求解!
可用“递归”和“备忘录方法”两种方法分别求解,并测试一下效率。
递归实现整数因子分解的计数。假设对正整数n的因子分解计数为solve(n)。
1)当n=1时,计数加1。
2)当n>1时,对n的每个因子i,计算solve(n/i)。
或者这样实现也可以:
int solve2(int n)
{
int num=0;
if(n==1) return 1;
for(int i=2; i<=n; i++)
if(n%i == 0) num+=solve2(n/i);
return num;
}
有重复元素的排列问题
Description 设集合R={r1,r2,...,rn}是要进行排列的n个元素,其中r1,r2,...,rn可能相同。
试着设计一个算法,列出R的所有不同排列。
即,给定n以及待排的n个可能重复的元素。计算输出n个元素的所有不同排列。
输入格式 第1行是元素个数n,1<=n<=15。接下来的1行是待排列的n个元素,元素中间不要加空格。
输出格式 程序运行结束时,将计算输出n个元素的所有不同排列。最后1行中的数是排列总数。
输入样例 4
aacc
输出样例 aacc
acac
acca
caac
caca
ccaa
6
在递归产生全排列的那段程序开始之前,
加一个判断:判断第i个元素是否在list[k,i-1]中出现过。
PermExcludeSame(char list[], int k, int m)
{
......
for (int i=k; i<=m; i++)
{
if (Findsame(list,k,i))//判断第i个元素是否在list[k,i-1]中出现过
continue;
Swap (list[k], list[i]);
PermExcludeSame(list, k+1, m);
Swap (list[k], list[i]);
}
}