문제 풀이
[c++] 백준 10710 실크로드
미분당한 적분상수
2023. 4. 20. 02:29
https://www.acmicpc.net/problem/10710
10710번: 실크로드
입출력 예 1에서 쌓이는 피로도의 합계를 최소화하도록 JOI 군이 이동하려면 다음과 같이한다. 1 일째는 대기한다. 2 일째에 도시 0 -> 도시 1로 이동한다. 이때 쌓이는 피로도는 10 × 30 = 300이다. 3
www.acmicpc.net
dp[i][j] : i번째 도시에 있을 때 날짜 j 라고 dp테이블을 정의하자.
날짜가 변함에 따라 할 수 있는 행동이 두 가지다.
1. 가만히 있는다.
2. 다음 도시로 간다.
단순한 dp문제라 간단히 해결할 수 있었다.
#include<bits/stdc++.h>
using namespace std;
#define INF 987654321
int n,m;
int dist[1111];
int weather[1111];
int dp[1111][1111];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m;
for(int i=0; i<n; i++)
cin>>dist[i];
for(int i=0; i<m; i++)
cin>>weather[i];
for(int i=0; i<=1110; i++)
for(int j=0; j<=1110; j++)
dp[i][j] = INF;
//dp[d][l] : 위치(l)에서 날짜(d)
dp[0][0] = 0;
for(int d=0; d<=m; d++){
for(int l=0; l<=d && l<=n; l++){
// 가만히 있는다.
dp[d+1][l] = min(dp[d][l], dp[d+1][l]);
// 다음 도시로 간다.
dp[d+1][l+1] = min(dp[d+1][l+1], dp[d][l] + weather[d]*dist[l]);
}
}
cout << dp[m][n];
return 0;
}