문제 설명
길이가 L인 막대가 주어졌을 때, 작업은 길이가 p, q, r인 세그먼트의 총 수가 최대가 되도록 막대를 자르는 것입니다. 세그먼트의 길이는 p, q 및 r일 수 있습니다.
l =15, p =2, q =3 및 r =5이면 다음과 같이 7개의 세그먼트를 만들 수 있습니다. -
{2, 2, 2, 2, 2, 2, 3}
알고리즘
동적 프로그래밍을 사용하여 이 문제를 해결할 수 있습니다.
1. Initialize dp[] array to 0 2. Iterate till the length of the rod. For every i, a cut of p, q and r if possible is done. 3. Initialize ans[i+p] = max( ans[i+p], 1 + ans[i]), ans[i+q] = max(ans[i+q], 1 + ans[i]) and ans[i+r] = max(ans[i+r], 1 + ans[i]) for all the possible cuts. 4. ans[i] will be 0 if a cut at i-th index is not possible. ans[l] will give the maximum number of cuts possible
예시
#include <bits/stdc++.h> using namespace std; int getMaximumSegments(int l, int p, int q, int r){ int dp[l + 1]; memset(dp, -1, sizeof(dp)); dp[0] = 0; for (int i = 0; i <= l; ++i) { if (dp[i] == -1) { continue; } if (i + p <= l) { dp[i + p] = max(dp[i + p], dp[i] + 1); } if (i + q <= l) { dp[i + q] = max(dp[i + q], dp[i] + 1); } if (i + r <= l) { dp[i + r] = max(dp[i + r], dp[i] + 1); } } return dp[l]; } int main(){ int l = 15, p = 2, q = 3, r = 5; cout << "Number of segments = " << getMaximumSegments(l, p, q, r) << endl; return 0; }
출력
위의 프로그램을 컴파일하고 실행할 때. 다음 출력을 생성합니다-
Number of segments = 7