https://www.acmicpc.net/problem/1932
#include<iostream>
#include<memory.h>
#include<algorithm>
int dp[501];
int arr[501];
using namespace std;
int main(void)
{
int n,num=0;
int i=0, j, k;
memset(arr, 0, sizeof(arr));
memset(dp, 0, sizeof(arr));
cin >> n;
while (n != i)
{
num += ++i;
}
for (i = 1; i <= num; i++)
cin >> arr[i];
j = num;
k = n;
for (i = num; i >= 1; i--)
{
if (i == j - k)
{
j = i;
k--;
}
if (i > num - n)
{
dp[i] = arr[i];
}
else
{
dp[i] = max(dp[i + k + 1], dp[i + k]) + arr[i];
}
}
cout << dp[1] << endl;
return 0;
}
남들 소스 보면 dp 2차원으로 이용해서 하던데 1차원으로 했는데 왜 런타임 뜨는거죠? ㅡ.ㅡ
런타임 에러야 시간초과야
시간초과면 cout printf로 바꿔보고 런타임 에러면 어딘가 꼬였겠지..
미리 손코딩으로 예외경우 다 해보고 그다음에 코딩한거라 틀린점은 없고, 문제관련 출력 결과는 똑같이 나오는데..
해당 트리의 높이 안에서의 max치를 찾아서 그 max만 연산하게끔 해야지 런타임 에러 없앨수있는건가여?
n이 100이면 num 이 5050 까지 올라갈텐데 배열의 크기는 500 밖에 없네요
휴 감사감사 500 피보나치 125251로 지정하니 맞았다 나오네요
멤셋이라니... 제발 저런거 쓰지마
algorithm 에 std::fill 있으니까 그거 써...
fill이랑 memset이랑 차이점 있나여?
STL 이니까 아마 조금 더 엄격한 타입 채킹을 하기 때문에 더 안전합니다.
그리고 C가 아니라 C++을 하시면 이왕이면 C++에서 주는 추상화 도구들을 사용하는걸로...
아하 감사감사합니다
프갤에서 많이 배웁니다 감사감사