小编Ras*_*mov的帖子

最长的链条可以安排

我在比赛的某个地方发现了这个问题,但还没有找到解决方案.

我有正整数.我必须找到最长的子集,在每两个相邻元素中,一个除以另一个.

我正在做的是:我正在创建图形.然后我正在连接其中数字彼此分开的节点.之后我正在使用DFS(一个节点可以连接两个节点).

但并非所有测试用例都适用于系统.在使用之前我是否必须对数组进行排序DFS?也许有特殊的(动态)算法?

失败的测试用例:

N = 5
1 1 3 7 13
Run Code Online (Sandbox Code Playgroud)

我的代码给出了输出4.但如果我arrange这个数组像这样:

3 1 7 1 13
Run Code Online (Sandbox Code Playgroud)

输出是5,这是真正的答案.

我也使用了递归方法.但我需要更快的东西.

c++ algorithm graph-theory depth-first-search

9
推荐指数
1
解决办法
418
查看次数

找到填充矩形的最小MS Paint操作数

我在比赛的某个地方发现了这个问题,但还没有找到解决方案.

我可以在屏幕上的另一个地方"选择","复制","插入"和"移动".最初我有一个大小为1x1的矩形.我需要做的最少量的操作来构建另一个矩形,其大小是AxB.

这是我的错误代码:

#include <iostream>
#include <cmath>
#define size 1002
using namespace std;

int main()
{
    int painta[size];
    int paintb[size];
    int i,j,a,b,temp;

    cin >> a >> b;
    if (a>b)
    {
        temp=a;
        a=b;
        b=temp;
    }

    painta[1]=4;
    for (i=2; i<=a; i++)
        painta[i]=painta[i-1]+2;

    for (i=2; i<=a; i++)
    {
        painta[2*i]=min(painta[i]+4,painta[2*i]);
        for (j=3*i; j<=a; j+=i)
        {
            painta[j]=min(painta[j-i]+2,painta[j]);
        }
    }

    paintb[1]=painta[a];
    paintb[2]=paintb[1]+4;

    for (i=3; i<=b; i++)
        paintb[i]=paintb[i-1]+2;

    for (i=2; i<=b; i++)
    {
        paintb[2*i] = min(paintb[i]+4,paintb[2*i]);
        for (j=3*i; j<=b; j+=i)
        {
            paintb[j]=min(paintb[j-i]+2,paintb[j]);
        }
    }
    cout << paintb[b] …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm dynamic-programming

5
推荐指数
1
解决办法
163
查看次数