HihoCoder - 1636 Pangu and Stones - 구간 dp
2058 단어 동적 기획
사고방식: dp[i][j][k]를 구간[i, j]으로 정의하고 k가 돌을 쌓을 때의 최소치를 포함한다. 최종 결과는 dp[1][n][1]이다. 즉, 전체 구간이 최종적으로 1무더기의 최소치로 통합되고 뚜렷한 dp[i][j][1]이 해답의 중점이다.
dp[i][j][1]의 상태 전이 방정식을 풀려면 dp[i][j][1]=min(dp[i][j][1], dp[i][j]][k]+sum[j]-sum[i-1])))(2<=k<=r(r는 제목이 정해진 것이다))
그 중에서sum[]예처리 접두사와 임의의 연속 구간의 합을 계산하는 데 사용되는 것은 구간 [i, j] 중의 모든 더미를 1개의 더미로 합치려면 어쨌든 이 구간의 총계를 써야 한다. dp[i][j][k](2 <=k<=r)는 각각 다른 구분을 하고 최종적으로 최소치를 찾는다.
dp[i][j][k](2 <=k>=r)의 상태 전이 방정식은 dp[i][j][k]=min(dp[i][j]][k], dp[i][p][1]+dp[p+1][j][k-1]))(i<=p
#include
#include
#include
#include
using namespace std;
const int maxn = 105;
const int INF = 0x3f3f3f3f;
int n, l, r, a[maxn], sum[maxn], dp[maxn][maxn][maxn];
int main() {
while (~scanf("%d %d %d", &n, &l, &r)) {
sum[0] = 0;
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
sum[i] = sum[i-1] + a[i];
}
memset(dp, INF, sizeof(dp));
for (int i = 1; i <= n; i++) dp[i][i][1] = 0;
for (int len = 1; len <= n; len++) {
for (int i = 1; i + len - 1 <= n; i++) {
int j = i + len - 1;
for (int k = min(r, len); k >= 2; k--) {
for (int p = i; p < j && j - p >= k - 1; p++) {
dp[i][j][k] = min(dp[i][j][k], dp[i][p][1] + dp[p+1][j][k-1]);
}
if (k >= l) dp[i][j][1] = min(dp[i][j][1], dp[i][j][k] + sum[j] - sum[i-1]);
}
}
}
printf("%d
", dp[1][n][1] == INF ? 0 : dp[1][n][1]);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
01 가방, 완전 가방, 다중 가방 dp(동적 기획 입문 dp)01 가방은 2진법으로 직접 표시할 수 있지만 데이터 양이 너무 많으면 시간을 초과하는 것이 폭력이다.01 가방의 사상은 바로 이 물품에 대해 내가 넣은 가치가 큰지 안 넣은 가치가 큰지 비교하여 방정식 f[i][v...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.