回 帖 发 新 帖 刷新版面

主题:大家帮帮忙!++++++++++++分!

请大家告诉我如何做?最好有程序!!!

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个回复)

沙发

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.

板凳

第二题是动态规划
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 楼

我想知道这两题的思路,能告诉我吗?

4 楼

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 楼


思路:1、回溯法
      2、动态规划
就这么简单!

6 楼

第一题没什么好说的,就是第二题比较有趣,建议做一下NOIP1998的第一题,一模一样,求最长上升子序列.
[em7][em7][em7][em7]

7 楼


谁说一模一样??人家是最长上升序列!!

8 楼

第二题怎样动态规划?

9 楼


就是从前向后,每一个找到当前的最长序列,后面的就按动归的方法继续找

10 楼

第2题的动态规划就如楼上所说的从前往后找

    它i每循环一次就记录了当前位置在前面可求得的最长不下降序列
   
    当下次循环时若又找到一个更大的就把前面已算好的拿来累加上去


    到最后输出时只需找一找哪个数最大便可以了

我来回复

您尚未登录,请登录后再回复。点此登录或注册