hdu 1506 Largest Rectangle in a Histogram(동적 계획, 뛰어난 최적화)

1124 단어 동적 기획
이 문제는 일반적인 사고방식에 따라 직접 계산하면 시간을 초과해야 하며 반드시 어느 정도의 최적화를 거쳐야 한다.
a[i]에 대해 우리가 기록해야 할 것은 그의 이전과 이후의 가장 큰 연속 값이 a[i]보다 큰 길이이다. 만약에 매번 하나씩 비교해 보면 데이터 크기는 100000이고 시간 복잡도는 O(n^2)이다. 시간 초과는 필연적이다.그러나 사실 a[i]에 대해 말하자면 뒤에 있는 연속적인 값을 구하면 하나하나 비교할 필요가 없다. 직접 a[i+1]의 값을 보면 된다.
예를 들어 2, 3, 4, 5라는 서열을 보면 만약에 우리가 3이 뒤로 얼마나 길게 뻗을 수 있는지 보려면 4와 5를 비교할 필요가 없다. 4를 계산할 때 우리는 5가 4보다 크다고 계산했다. 왜냐하면 3은 4보다 작고 4가 뒤로 뻗을 수 있는 길이는 3도 반드시 도달할 수 있기 때문이다(4가 뻗을 수 있는 길이 내의 데이터는 모두 4보다 크고 물론 모두 3보다 크다). 우리는 4가 도달한 최종 길이의 끝에 있는 값을 직접 비교할 수 있다.
이 문제를 계산할 때 진법 변환도 각별히 주의해야 한다. 만약temp가 로 강제로 변환되지 않았다면int64비트, 제출회wa.
이 문제의 최적화된 사고방식은 매우 교묘하여 배울 만하다.
#include
#define N 100005
int a[N],s[N],e[N];
int main()
{
	int n;
	while(scanf("%d",&n),n)
	{
		int i;
		for(i=0;i=1&&a[s[i]-1]>=a[i])
				s[i]=s[s[i]-1];
		}
		for(i=n-1;i>=0;i--)
		{
			while(e[i]=a[i])
				e[i]=e[e[i]+1];
		}
		__int64 ans;
		ans=0;
		for(i=0;ians)
				ans=temp;
		}
		printf("%I64d
",ans); } return 0; }

좋은 웹페이지 즐겨찾기