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;
}
答案 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)个矩形可以正常放置或旋转。从这两种选择中获取最大周长就可以了。
希望这有帮助