主题:大家帮帮忙!++++++++++++分!
泡泡糖
[专家分:230] 发布于 2007-07-25 13:09:00
请大家告诉我如何做?最好有程序!!!
1。整数划分问题:
将一正整数(N)划分为一系列正整数之和:
n=a1+a2+a3+……+ak (a1>=a2>=a3……>=ak) (k>=1)
如:
输入:
6
则输出:
6
5+1
4+2
4+1+1
3+3
3+2+1
3+1+1+1
2+2+2
2+2+1+1
2+1+1+1+1
1+1+1+1+1+1
m=11
2.最长上升段
给出一段数列,求最长的上升段:
如:数列 1 7 3 6 4 5
则有3个上升段:
1: 1 7
2: 1 3 6
3: 1 3 4 5
所以最长的上升段为:1 3 4 5
长度为4;
求:输入一数列,求出最长上什段的长度
回复列表 (共11个回复)
沙发
Matodied [专家分:7560] 发布于 2007-07-25 13:55:00
1、(说到底这就是回朔)
TYPE arr = ARRAY[1..1023] OF INTEGER;
VAR
a: arr;
n, s, t, m: INTEGER;
PROCEDURE pri;
VAR
i: INTEGER;
BEGIN
FOR i:=1 TO t - 1 DO WRITE(a[i], '+');
WRITELN(a[t]); m := m + 1;
END;
BEGIN
READLN(n);
s := 0; t := 1;
REPEAT
a[t] := a[t] + 1; s := s + a[t];
IF s >= n THEN BEGIN
IF s = n THEN pri;
s := s - a[t]; t := t - 1; s := s - a[t];
END ELSE BEGIN
t := t + 1; a[t] := a[t - 1] - 1;
END;
UNTIL t = 0;
WRITELN('m=', m);
END.
板凳
bigchen [专家分:1940] 发布于 2007-07-25 15:28:00
第二题是动态规划
var
a:array[1..100] of integer;
f:array[1..100] of integer;
n,i,j,k,l:integer;
begin
readln(n);
for i:=1 to n do
begin
read(a[i]);f[i]:=1;
end;
for i:=2 to n do
begin
k:=0;
for j:=1 to i-1 do
if (a[j]<a[i]) and (f[j]>k) then k:=f[j];
f[i]:=f[i]+k;
end;
k:=0;
for i:=1 to n do
if f[i]>k then k:=f[i];
writeln(k);
end.
3 楼
泡泡糖 [专家分:230] 发布于 2007-07-25 19:34:00
我想知道这两题的思路,能告诉我吗?
4 楼
Matodied [专家分:7560] 发布于 2007-07-25 21:04:00
1、
基本思想:
a[t] := a[t] + 1; s := s + a[t];
把目前的元素a[t](t是指针)加上1,然后s加上a[t]的值。
这时的s可能会出现2种情况:
(1)s>=n,则:
(IF s = n THEN pri;)
若s=n则调用打印的过程pri.
s := s - a[t]; t := t - 1; s := s - a[t];
由于s超界,则s要减去目前a[t]的值,然后扔掉a[t],t-1,再把这个超界的a[t]给减掉。
(2)s<n,则:
a[t]取值成功,t+1,由于每一个元素都大于等于前面的元素,则下一个元素的初值是这个元素的值减1(因为后面一次DO循环要把这个值加1)
最后直到t=0,表示所有的可能都搜索了,搜索就可以结束了。
5 楼
cmy28 [专家分:380] 发布于 2007-07-30 16:12:00
思路:1、回溯法
2、动态规划
就这么简单!
6 楼
abcwuhang [专家分:1840] 发布于 2007-07-30 22:09:00
第一题没什么好说的,就是第二题比较有趣,建议做一下NOIP1998的第一题,一模一样,求最长上升子序列.
[em7][em7][em7][em7]
7 楼
cmy28 [专家分:380] 发布于 2007-07-30 22:26:00
谁说一模一样??人家是最长上升序列!!
8 楼
泡泡糖 [专家分:230] 发布于 2007-07-31 18:14:00
第二题怎样动态规划?
9 楼
cmy28 [专家分:380] 发布于 2007-07-31 19:40:00
就是从前向后,每一个找到当前的最长序列,后面的就按动归的方法继续找
10 楼
interegg [专家分:80] 发布于 2007-08-03 22:20:00
第2题的动态规划就如楼上所说的从前往后找
它i每循环一次就记录了当前位置在前面可求得的最长不下降序列
当下次循环时若又找到一个更大的就把前面已算好的拿来累加上去
到最后输出时只需找一找哪个数最大便可以了
我来回复