问题标题: 酷町堂:3395 下降序列求大佬求解

0
0
已解决
王梓澳
王梓澳
中级光能
中级光能

问题:

3395   下降序列

题目描述 Description

现在有一个区域由一个二维数组给出。数组的每个数字代表点的高度。小明想知道在一个区域中最长的降序序列,下面是一个例子:

1 2 3 4 5

16 17 18 19 6

15 24 25 20 7

14 23 22 21 8

13 12 11 10 9

一个人可以从某个点向上下左右相邻四个点之一移动,当且仅当高度减小。在上面的例子中,一条可行的移动方案为24-17-16-1(从24开始,在1结束)。当然25-24-23―┅―3―2―1更长。事实上,这是最长的一条。

输入描述 Input Description

输入的第一行为表示区域的二维数组的行数R和列数C(1≤R,C≤100)。下面是R行,每行有C个数,代表高度(两个数字之间用1个空格间隔)。

输出描述 Output Description

输出区域中最长下降序列的长度。

样例输入 Sample Input

 

5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

样例输出 Sample Output

 

25

我的程序:

#include <iostream>
#include <algorithm>
using namespace std;
int a[101][101];
int main ()
{
    int m,n,i1=0,j1=0;
    int maxa=-999999;
    cin>>m>>n;
    for (int i=1;i<=m;i++)
    {
        for (int j=1;j<=n;j++)
        {
            cin>>a[i][j];
            int tmp=maxa;
            maxa=max(a[i][j],maxa);
            if (a[i][j]>=maxa)
            {
                i1=i;
                j1=j;
            }
        }
    }
    int count=0;
    while (1)
    {
        int maxx[4]={a[i1-1][j1],a[i1+1][j1],a[i1][j1-1],a[i1][j1+1]};
        sort(maxx,maxx+4);
        int f=1;
        cout<<"maxx1="<<maxx[0]<<"  maxx2="<<maxx[1]<<"  maxx3="<<maxx[2]<<"  maxx4="<<maxx[3]<<endl;
        for (int i=n-1;i>=0;i--)
        {
            if (maxx[i]<maxa)
            {
                maxa=maxx[i];
                count++;
                if (maxx[i]==a[i1-1][j1])
                    i1--;
                if (maxx[i]==a[i1+1][j1])
                    i1++;
                if (maxx[i]==a[i1][j1-1])
                    j1--;
                if (maxx[i]==a[i1][j1+1])
                    j1++;
                break;
            }
            else if (i==0)
                f=0;
        }
        if (!f)
            break;
    }
    cout<<count;
    return 0;
}

运行过后是对的,结果把

cout<<"maxx1="<<maxx[0]<<"  maxx2="<<maxx[1]<<"  maxx3="<<maxx[2]<<"  maxx4="<<maxx[3]<<endl;

这个删了就变成1了


0
已采纳
何文轩
何文轩
高级守护
高级守护

最长的线路不一定包括最大的那个数,应该每个点都要寻找。

0
我要回答