문제출처 : https://www.acmicpc.net/problem/3976
와 이문제 역대급으로 어려웠던것 같다. 성공확률 은 82퍼였는데, 고인물들만 풀어서 성공확률이 높지않았나.. 싶더라
나도 블로그를 보고 참고해서 작성했다.
참고블로그 : https://cocoon1787.tistory.com/379
code
#include <iostream>
#include <algorithm>
using namespace std;
int pass[2][100001] = {};
int dribble[2][100001] = {};
int dp[2][100001] = {};
int main()
{
int c, n, l1, l2, s1, s2, i;
cin >> c;
while (c--)
{
cin >> n >> l1 >> l2 >> s1 >> s2;
for (int i = 0; i < n-1; i++)
cin >> pass[0][i];
for (int i = 0; i < n-1; i++)
cin >> dribble[0][i];
for (int i = 0; i < n-1; i++)
cin >> pass[1][i];
for (int i = 0; i < n-1; i++)
cin >> dribble[1][i];
dp[0][0] = l1;
dp[1][0] = l2;
for (i = 1; i < n; i++)
{
dp[0][i] = min(dp[0][i-1]+dribble[0][i-1],dp[1][i-1]+pass[1][i-1]);
dp[1][i] = min(dp[1][i-1]+dribble[1][i-1],dp[0][i-1]+pass[0][i-1]);
}
cout << min(dp[0][n-1] + s1, dp[1][n-1] + s2) << '\n';
}
return 0;
}
여기서는 dp[0]는 스트라이커 1,dp[1]은 스트라이커 2의 시점에서 케이스를 나눠서 생각했다.
수비수에게 패스받은 난이도를 각각 dp[0][0],dp[1][0]에 저장하고,
dp[0][i] 부터는 dp[0][i-1]부터 드리블을 해온경우, dp[1][i-1]에게서 패스를 받은경우중 최소값을 저장한다.
그리고 스트라이커 1 (dp[0])와 스트라이커 2(dp[1])의 난이도를 비교해서 최솟값을 출력한다.
나는 if문을 몇개써야하나 이생각에 사로잡혀서 코드가 엄청길어졌었는데, 이렇게 간단?하지는 않지만 비교적으로 간단하게 표현가능하다는거에 놀랐다....