0
NGON 문제를 해결하려고합니다. 여기에 동적 프로그래밍을 사용하고 있습니다. 되풀이 함수는 다음과 같습니다.이 솔루션에 대한 잘못된 답을 제공하는 SPOJ
f(a,b) = f(a-1,b) + f(a-1,b-1)*ai +f(a-1,b-2)*ai*(ai-1)/2, a>0,b>0
f(a,0) = 1,
f(0,b) = 0,
ai가 ath면에있는 점입니다.
그러나 나는 틀린 답을 얻고 있습니다. 다른 사람의 코드를 읽는 것이 어렵다는 것을 알고 있지만 진정으로 도움을 주시면 감사하겠습니다. 나는 오버플로를 돌 보았다고 느낍니다. 또한 최적화가 가능한지 제안하십시오.
#include<stdio.h>
#define MAX 1010
#define MODULO 1000000007
int main()
{
int test_cases,i,a,b;
int sides,points[MAX];
unsigned long long int result[MAX][MAX],temp;
for(scanf("%d",&test_cases);test_cases>0;test_cases--)
{
scanf("%d",&sides);
for(i=0;i<sides;i++)
{
scanf("%d",&points[i]);
}
result[0][0]=1;
for(a=1;a<=sides;a++)
{
result[a][0]=1;
result[0][a]=0;
}
for(a=1;a<=sides;a++)
{
for(b=1;b<=sides;b++)
{
if(b>2*a)
{
result[a][b]=0;
}
else
{
result[a][b]=(result[a-1][b]+result[a-1][b-1]*points[a-1])%MODULO;
if(b>1)
{
temp=(result[a-1][b-2]*points[a-1]*(points[a-1]-1))%MODULO;
temp=temp>>1;
result[a][b]=(result[a][b]+temp)%MODULO;
}
}
}
}
printf("%lld\n",result[sides][sides-1]);
}
return 0;
}
답변 주셔서 감사합니다. AC가 있습니다. 한 가지 더 물어보고 싶지만, long long int와 modulo 계산을 최적화하여 어떤 방식 으로든 더 빠르게 만들 수있는 방법이 있습니까? 나는 asymptotically 알고리즘 제한이 O (n^2)라고 생각한다. – Naman
a의 각 값에 대해 (points [a-1] * (points [a-1] -1)) >> 1)에 대한 답을 미리 계산하는 것이 도움이 될 수 있습니다. b에서 2로 min , 2 * a) 누락 된 경우에 대처하기 위해 루프 전후에 여분의 코드를 추가해야하지만 내부 루프 밖으로 조건식을 가져 오려면 –
감사합니다. 사전 계산이 도움이되었습니다. 내 코드 시간. – Naman