하악 이건데.. 자꾸 시간초과가 뜨네요
알고리즘 문제 사이트에서 이번이 3번째로 풀어보는건데 시간초과라는건 처음 당해봅니다 하악....
뭐가 가장 큰 문제일까요 포문이 너무 많은걸까요? 아래는 비루한 저의 코드입니다. 조언좀 해줘세요 ㅠㅠ
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int cnt = 0;
int findMaxTree(int ** ar, int size, int i, int j, int n1, int n2);
void findWay(int ** ar, int size, int i, int j, int n1, int n2, int max);
int main(void)
{
int atestCase;
int n;
int ** ar;
int max = 0;
scanf("%d", &atestCase);
for (int i = 0; i < atestCase; i++)
{
scanf("%d", &n);
ar = (int**)malloc(sizeof(int*)*n);
for (int i = 0; i < n; i++)
ar[i] = (int*)malloc(sizeof(int)*(i + 1));
for (int i = 0; i < n; i++)
{
for (int j = 0; j <= i; j++)
scanf("%d", &ar[i][j]);
}
max = findMaxTree(ar, n, 0, 0, ar[0][0], ar[0][0]);
findWay(ar, n, 0, 0, ar[0][0],ar[0][0],max);
printf("%d", cnt);
cnt = 0;
}
return 0;
}
void findWay(int ** ar, int size, int i, int j, int n1,int n2, int max)
{
if (i >= size - 1)
{
if (n1 == max)
cnt++;
return;
}
int x1 = n1;
int x2 = n2;
x1 += ar[i+1][j];
x2 += ar[i + 1][j + 1];
findWay(ar, size, i + 1, j, x1, x1, max);
findWay(ar, size, i + 1, j + 1, x2, x2, max);
return;
}
int findMaxTree(int ** ar, int size, int i, int j, int n1, int n2)
{
int x1 = n1;
int x2 = n2;
if (i >= size - 1)
{
if (x1 > x2)
return x1;
else
return x2;
}
x1 += ar[i + 1][j];
x2 += ar[i + 1][j + 1];
int len1 = findMaxTree(ar, size, i + 1, j, x1, x1);
int len2 = findMaxTree(ar, size, i + 1, j + 1, x2, x2);
if (len1 >= len2)
{
return len1;
}
else
{
return len2;
}
}
ㄱㄷ
글을 따로 쓸 건 아닌거 같네
동적 계획법(dynamic programming)이란 거에 대해서 알아보면 좋을듯.
알고리즘 책도 사서 공부하세염
모르는거 프갤에 올리면 질문 달아드림.. 저도 잘 하지는 못하지만
숫자삼각형 비슷한문제네 일단 dp를 알아야 쉽게풀듯
여기 사이트 어디임? 공부하기 좋아보인다