교수형 장식-문제 해결 아이디어

머리말:

정오에 우리는 첫 번째 질문을 시작한 후 2 학년 반 친구들과 함께 질문을했습니다. 나는 노를 젓기 시작했고이 질문을 끊을 생각조차하지 않았기 때문에 오늘은 여가 시간을 활용 하여 검토하고 요약 할 충분한 시간을 가졌습니다.


장식품 Luogu P4138

아이디어 :

요컨대, 이것은 01 배낭-더 나은 질문입니다.
비용은 연결 (2 차원) 또는 1 차원 이지만 내 능력은 제한적입니다 .

노트! 상태 전이 방정식은 다음과 같이 작성하면 안됩니다.

f[i][j]=max(f[i-1][j],f[i-1][j-w[i]+1]+v[i]);

왜? !

jw [i] +1은 음수 일 수 있으므로 무의미합니다. 이때 항목이 휴대폰에 직접 걸려있는 것으로 간주해야합니다 (예 : j = 1). 의미가 있는지 확인하기 위해 jw [i]와 0의 최대 값을 가져와야합니다.

따라서 올바른 상태 전이 방정식은 다음과 같습니다.

f[i][j]=max(f[i-1][j],f[i-1][max(j-w[i].a,0)+1]+w[i].b);

여기서 a는 후크이고 b는 값입니다.

그런 다음 초기 값
을 지정하고 불가능한 상황을 최소값, 즉

 f[0][i]=MAXN,f[i][n+1]=MAXN;

그러면 초기 상태 인 f [0] [1] = 0입니다.


그럼 왜 정렬할까요?

이해 해주셔야 할 것 같지만, 저는 여전히 그것에 대해 이야기하고 싶습니다.
왜냐하면 가장 큰 기쁨을주는 물건들은 먼저 끊어야하기 때문에 그것들은 분류되어야하기 때문입니다.

노트:

배열이 범위를 벗어난 상황을 처리하는 방법 :

1≤N≤2000, 0≤Ai≤N (1≤i≤N), 최대
2000 × 2000 = 4000000 개의 후크가있을 수 있음을 알 수 있습니다. 분명히 우리는 하나씩 전송할 어레이를 너무 많이 열 수 없습니다. 그렇지 않으면 T가됩니다. .
관찰을 통해 N은 2000 개에 불과하여 최대 2000 개의 후크 만 사용된다는 것을 알 수 있으므로 2000 개를 초과하는 후크 수를 계산할 때 2000 개가 한계이므로 결과에서 직접 후크 수를 2000 개로 간주합니다. 대답에 영향을 미치지 않습니다.

음수를 처리하기 위해 maxx []의 첨자를 2000으로 늘려 음수 범위 내의 값을 표현할 수 있도록했습니다.


AC 코드 :

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
const int MAXN = -1000000000;
int f[4005][4005];
struct leimu {
    
    
    int a, b;
} w[4005];
bool cmp(leimu i, leimu j) {
    
     return i.a > j.a; }
int ans = -2147483647;
int main() {
    
    
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%d%d", &w[i].a, &w[i].b);
    sort(w + 1, w + 1 + n, cmp);
    for (int i = 0; i <= n; i++) f[0][i] = MAXN, f[i][n + 1] = MAXN;
    f[0][1] = 0;
    for (int i = 1; i <= n; i++) {
    
    
        for (int j = 0; j <= n; j++) {
    
    
            f[i][j] = max(f[i - 1][j], f[i - 1][max(j - w[i].a, 0) + 1] +
                                           w[i].b);  // f[i][j]表示前i件物品在有j个挂钩的情况下的最大价值
        }
    }
    for (int i = 0; i <= n; i++) ans = max(ans, f[n][i]);  //每个钩子都有可能
    printf("%d", ans);
    return 0;
}

구조를 연 이유도 다른 거물들의 방식에서 차용 한 것인데, 좀 더 편리하다. 훅이 많은 훅이 먼저 계산되도록 정렬을해야하는데, 훅 수가 적은 계산은 전화에 여러 번 걸려 버릴 가능성이 있기 때문이다. 의미.

종료


요약:

동적 프로그래밍 각 질문은 분석 할 가치가 있으며 각 상태 전환 방정식의 의미를 이해하기 위해 Gangster 가 더 강력 할 수 있습니다 .

추천

출처blog.csdn.net/C202207LYX/article/details/106892379