dp문제다. 그것도 3차원
어떻게 어찌어찌 하다 보니까 맞았던 문제다.
#include<iostream>
#include<vector>
using namespace std;
long long int a, dp[100000][5][5], minn=5;
int min1, min2;
vector<int> v;
int dis(int a, int b){
if(a==0 or b==0) return 2;
if(a==b) return 1;
if(abs(a-b)==2) return 4;
else return 3;
}
int main(){
while(cin >> a){
if(a==0) break;
v.push_back(a);
}
if(v.size()==0){
cout << "0";
return 0;
}// default
for(int i=0;i<v.size();i++){
for(int j=0;j<=4;j++){
for(int k=0;k<=4;k++) dp[i][j][k]=1e6;
}
} // for distancewise correction
dp[0][v[0]][0]=2;
for(int i=1;i<v.size();i++){
for(int j=0;j<=4;j++){
min1=1e6, min2=1e6;
for(int k=0;k<=4;k++){
if(j==k) continue;
if(min1>dp[i-1][k][j]+dis(k, v[i])) min1=dp[i-1][k][j]+dis(k, v[i]);
if(min2>dp[i-1][j][k]+dis(k, v[i])) min2=dp[i-1][j][k]+dis(k, v[i]);
}
dp[i][v[i]][j]=min1;
dp[i][j][v[i]]=min2;
}
}
int N=v.size()-1, minn=1e6;
for(int i=0;i<=4;i++){
for(int j=0;j<=4;j++){
if(i==j) continue;
if(minn>dp[N][i][j]) minn=dp[N][i][j];
}
}
cout << minn;
}
다음은 너다 ACM CRAFT
'작디작은 PS기록' 카테고리의 다른 글
2-SAT (0) | 2024.04.25 |
---|---|
백준 알고리즘 일지 #1 (3) | 2024.04.21 |
백준 11780 : 플로이드2 (0) | 2024.03.10 |
백준 1865 : 웜홀 (0) | 2024.03.09 |
이 카테고리 주의사항 (0) | 2024.03.08 |