SPOJ MMAXPER :: RECTANGLE PERIMETER

时间:2013-08-27 09:19:49

标签: coding-style

http://www.spoj.com/problems/MMAXPER/

我不知道如何处理这个问题,因为我是dp问题的新手。 我正在尝试这种方法但得错了答案::

#include<stdio.h>
int main()
  {
    int i,t,l,s,temp;
    long long int sum=0;
    scanf("%d",&t);
    for(i=1;i<=t;i++)
      {
        scanf("%d %d",&s,&l);
        if(s>l) { temp=s; s=l; l=temp }
        if(i==1) sum=sum+l-s;
        else if(i==t && i%2==0) sum=sum+l+s;
        else if(i==t && i%2!=0) sum=sum+l-s;
        else if(i%2==0) sum=sum+2*l+s;
        else if(i%2!=0) sum=sum-2*s+l;
      }
    printf("%lld",sum);
    return 0;
  }

1 个答案:

答案 0 :(得分:2)

想一想你必须做出什么选择的问题。由于不允许重新排序,问题很简单。让我们看看:对于第i个矩形,您有2个选择,要么按原样使用,要么旋转它。如果p(i,0)是原始位置的第i个矩形的最大周长,而p(i,1)表示如果旋转第i个矩形则表示最大周长,这会产生一个简单的重复:

P(1,0)= MAX(P(I-1,0)+宽度(ⅰ)+ |高度(ⅰ)-height第(i-1)|,P(I-1,1)+宽度(ⅰ)+ |高度(ⅰ)-width第(i-1)|)

P(1,1)= MAX(P(I-1,0)+高度(ⅰ)+ |宽度(ⅰ)-height第(i-1)|,P(I-1,1)+高度(ⅰ)+ |宽度(ⅰ)-width第(i-1)|)

最终答案是max(p(n-1,0),p(n-1,1))

基本情况p(0,0)= height(i)和p(0,1)= width(i);

说明: 考虑到当前,即第i(1-1)个矩形可以正常放置或旋转。从这两种选择中获取最大周长就可以了。

希望这有帮助