#include <iostream> using namespace std; | |
int min(int a, int b) | |
{ return a > b? b:a; } | |
int min(int a, int b, int c) | |
{ return min(a,b) > c ? c: min(a,b);} | |
int main() | |
{ | |
int tc; | |
cin >> tc; | |
for(int T=1; T<=tc; T++) | |
{ | |
int cost[4]; | |
for(int i=0; i<4; i++) cin >> cost[i]; | |
int plan[13]; | |
for(int i=1; i<=12; i++) cin >> plan[i]; | |
int d[13][3]; | |
d[1][0]=cost[0]*plan[1]; | |
if(plan[1]!=0) | |
{ | |
d[1][1]=cost[1]; | |
d[1][2]=cost[2]; | |
} | |
else | |
{ | |
d[1][1]=0; | |
d[1][2]=0; | |
} | |
for(int i=2; i<=12; i++) | |
{ | |
bool x; | |
if(plan[i]==0) x=0; | |
else x=1; | |
if(i<4) | |
{ | |
d[i][0]=min(d[i-1][0],d[i-1][1])+plan[i]*cost[0]; | |
d[i][1]=min(d[i-1][0],d[i-1][1])+cost[1]*x; | |
d[i][2]=cost[2]*x; | |
} | |
else | |
{ | |
d[i][0]=min(d[i-1][0],d[i-1][1],d[i-1][2])+plan[i]*cost[0]; | |
d[i][1]=min(d[i-1][0],d[i-1][1],d[i-1][2])+cost[1]*x; | |
int cmp1=min(d[i-3][0]+ cost[2],d[i-3][1]+ cost[2],d[i-3][2]+ cost[2]); | |
int cmp2=min(d[i-2][0]+ cost[2],d[i-2][1]+ cost[2],d[i-2][2]+ cost[2]); | |
int cmp3=min(d[i-1][0]+ cost[2],d[i-1][1]+ cost[2],d[i-1][2]+ cost[2]); | |
d[i][2]=min(cmp1,cmp2,cmp3) ; | |
} | |
} | |
int min_cost=cost[3]; | |
for(int i=0; i<3; i++) | |
if(d[12][i]<= min_cost) min_cost=d[12][i]; | |
cout << "#" << T << " "<< min_cost << endl; | |
} | |
} |
샘플인풋은 맞는데 tc 48/50 이다 왤까ㅠㅠ
'알고리즘 문제 풀이 > 1DP_과제(~180615)' 카테고리의 다른 글
171126_2908_상수 (0) | 2017.11.26 |
---|---|
171125_1157_단어 공부 (0) | 2017.11.25 |
171123_2573_빙산 (0) | 2017.11.23 |
171123_1222_계산기1 (0) | 2017.11.23 |
171122_11654_아스키코드 (0) | 2017.11.22 |
#include <iostream> using namespace std; | |
int min(int a, int b) | |
{ return a > b? b:a; } | |
int min(int a, int b, int c) | |
{ return min(a,b) > c ? c: min(a,b);} | |
int main() | |
{ | |
int tc; | |
cin >> tc; | |
for(int T=1; T<=tc; T++) | |
{ | |
int cost[4]; | |
for(int i=0; i<4; i++) cin >> cost[i]; | |
int plan[13]; | |
for(int i=1; i<=12; i++) cin >> plan[i]; | |
int d[13][3]; | |
d[1][0]=cost[0]*plan[1]; | |
if(plan[1]!=0) | |
{ | |
d[1][1]=cost[1]; | |
d[1][2]=cost[2]; | |
} | |
else | |
{ | |
d[1][1]=0; | |
d[1][2]=0; | |
} | |
for(int i=2; i<=12; i++) | |
{ | |
bool x; | |
if(plan[i]==0) x=0; | |
else x=1; | |
if(i<4) | |
{ | |
d[i][0]=min(d[i-1][0],d[i-1][1])+plan[i]*cost[0]; | |
d[i][1]=min(d[i-1][0],d[i-1][1])+cost[1]*x; | |
d[i][2]=cost[2]*x; | |
} | |
else | |
{ | |
d[i][0]=min(d[i-1][0],d[i-1][1],d[i-1][2])+plan[i]*cost[0]; | |
d[i][1]=min(d[i-1][0],d[i-1][1],d[i-1][2])+cost[1]*x; | |
int cmp1=min(d[i-3][0]+ cost[2],d[i-3][1]+ cost[2],d[i-3][2]+ cost[2]); | |
int cmp2=min(d[i-2][0]+ cost[2],d[i-2][1]+ cost[2],d[i-2][2]+ cost[2]); | |
int cmp3=min(d[i-1][0]+ cost[2],d[i-1][1]+ cost[2],d[i-1][2]+ cost[2]); | |
d[i][2]=min(cmp1,cmp2,cmp3) ; | |
} | |
} | |
int min_cost=cost[3]; | |
for(int i=0; i<3; i++) | |
if(d[12][i]<= min_cost) min_cost=d[12][i]; | |
cout << "#" << T << " "<< min_cost << endl; | |
} | |
} |
샘플인풋은 맞는데 tc 48/50 이다 왤까ㅠㅠ
'알고리즘 문제 풀이 > 1DP_과제(~180615)' 카테고리의 다른 글
171126_2908_상수 (0) | 2017.11.26 |
---|---|
171125_1157_단어 공부 (0) | 2017.11.25 |
171123_2573_빙산 (0) | 2017.11.23 |
171123_1222_계산기1 (0) | 2017.11.23 |
171122_11654_아스키코드 (0) | 2017.11.22 |