카테고리 없음
[백준] C++ 9465번(스티커)
2zreal
2024. 7. 9. 00:01
#include <iostream>
using namespace std;
int main(void)
{
int a=0;
cin>>a;
for(int l=0; l<a; l++)
{
int n=0;
cin>>n;
int arr[2][100001]={0};
int DP[2][100001]={0};
for(int i=0; i<2; i++)
{
for(int j=0; j<n; j++)
{
cin>>arr[i][j];
}
}
DP[0][0]=arr[0][0];
DP[1][0]=arr[1][0];
DP[0][1]=DP[1][0]+arr[0][1];
DP[1][1]=DP[0][0]+arr[1][1];
int max=0;
for(int i=0; i<2; i++)
{
for(int j=0; j<2; j++)
{
if(DP[i][j]>max)
{
max=DP[i][j];
}
}
}
for(int i=2; i<n; i++)
{
if(DP[0][i-2]>DP[0][i-1])
{
DP[1][i]=arr[1][i]+DP[0][i-2];
}
else
{
DP[1][i]=arr[1][i]+DP[0][i-1];
}
if(DP[1][i-2]>DP[1][i-1])
{
DP[0][i]=arr[0][i]+DP[1][i-2];
}
else
{
DP[0][i]=arr[0][i]+DP[1][i-1];
}
}
if(DP[0][n-1]>max)
{
max=DP[0][n-1];
}
if(DP[1][n-1]>max)
{
max=DP[1][n-1];
}
cout<<max<<'\n';
}
return 0;
}
스티커는 두 변을 공유하지 않는 스티커 점수의 최댓값을 구하라.
일단 예제를 살펴보자.
예제에서는 (50, 50, 100, 60)이 정답이라고 말하고 있다.
60을 기준으로 살펴보겠다.
60을 기준으로 살펴보았을 때 이전에 가능한 경우는 100이거나 20인 경우다
왜 100과 20이 가능한 경우의 수냐??
일단 10은 인접해 있기 때문에 불가능하고, 20은 대각선에 있기 때문에 가능하다.
100을 왜 넣었냐?? 만약 100까지의 합이 20까지의 합보다 크다면 (20,10)을 뛰어넘는 것이 가능하다.
실제로 위 값은 100까지의 합이 20까지의 합보다 커서 100이 선택됨.
이러한 방법으로 스티커마다 가질 수 있는 최댓값을 계산해 주면 된다.