Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 查找填充矩形的最小MS绘制操作数_C++_Algorithm_Dynamic Programming - Fatal编程技术网

C++ 查找填充矩形的最小MS绘制操作数

C++ 查找填充矩形的最小MS绘制操作数,c++,algorithm,dynamic-programming,C++,Algorithm,Dynamic Programming,我在一次比赛中发现了这个问题,至今还没有找到解决办法 我可以在图形的另一个位置“选择”、“复制”、“插入”和“移动” 在屏幕上。最初我有一个大小为1x1的矩形。至少 为了建造另一座大楼,我必须做的这些操作的数量 矩形,其大小为AxB 这是我的错误代码: #include <iostream> #include <cmath> #define size 1002 using namespace std; int main() { int painta[size];

我在一次比赛中发现了这个问题,至今还没有找到解决办法

我可以在图形的另一个位置“选择”、“复制”、“插入”和“移动” 在屏幕上。最初我有一个大小为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] << endl;
    return 0;
}
#包括
#包括
#定义尺寸1002
使用名称空间std;
int main()
{
int painta[大小];
int paintb[大小];
内部i、j、a、b、温度;
cin>>a>>b;
如果(a>b)
{
温度=a;
a=b;
b=温度;
}
painta[1]=4;

对于(i=2;i您的方法是可以的,尽管您已经犯了一些实现错误,您可以通过检查一些小测试用例来发现这些错误

例如,一个失败的测试用例是
12
,其中您的程序给出了答案
8
,尽管
6
是正确的。这是因为您应该有
a>b
,而不是
b>a
,这样您的算法才能工作:

-    if (a>b)
+    if (a<b)
现在这里仍然有一个小的溢出,这可能会导致程序因大输入而崩溃:您正在访问循环内部的
painta[2*i]
paintb[2*i]
i
可以高达
1000
,但数组只有大小
1002
。很容易修复:

@@ -5,12 +5,12 @@

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

瞧,它通过了所有的测试用例。

请用简单的英语解释你的算法,以表达你认为它应该工作的直觉。另外,请列举问题的来源,这样我们可以保证它不是现场比赛的一部分,这样我们就有机会尝试自己的算法solutions@NiklasB我编辑了这些问题什么是“移动”操作?尝试测试用例<代码> 1 2 < /代码>。还考虑<代码> 1 5 < /代码>通过<代码> 1 9 < /代码>。
@@ -5,12 +5,12 @@

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