poj1976 2차원 0 1 bag

1233 단어
제목: 세 개의 와이드 넓이 구간에 가장 큰 숫자 조합을 넣을 수 있습니다
사고방식은 모든 것을 중첩하여sum수조로 하여 int형을 초과하지 않고 처리하기 편리하다는 것이다
그리고 전이 방정식 dp[i][j]=max(dp[i-1][j], dp[i-wide][j-1]+sum[i]-sum[i-wide])에 대한 이해:
바로 dp[i][j]에서 i는 앞의 i열차 코치가 가르칠 수 있는 인원수를 표시하고, j는 세 칸이 몇 칸을 썼는지 표시한다.
바로 앞의 모든 구간 장착 수량과 앞의 구간 및 앞의 구간에 이 구간 장착 인원을 더하면 어느 방안을 크게 취할 것인가
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;


int sum[50010];
int dp[50010][5];


int main()
{
    int T,wide,n;
    scanf("%d",&T);
    while(T--&&scanf("%d",&n))
    {
        sum[0]=0;
        int temp;
        for(int i=1;i<=n;i++){
            scanf("%d",&temp);
            sum[i]=sum[i-1]+temp;
        }
        scanf("%d",&wide);

        memset(dp,0,sizeof(dp));
        for(int i=wide;i<=n;i++)
            for(int j=1;j<=3;j++)
                dp[i][j]=max(dp[i-1][j],dp[i-wide][j-1]+sum[i]-sum[i-wide]);

        printf("%d
",dp[n][3]);     }     return 0; }

좋은 웹페이지 즐겨찾기