Hdu 1158 Employment Planning(DP)

1688 단어 HDU
문제 주소:http://acm.hdu.edu.cn/showproblem.php?pid=1158
 
dp 문 제 는 제 가 dp 에 대한 이해 가 부족 한 지 문 제 를 보고 풀 었 습 니 다. 힘 내세 요.
코드 부터 올 릴 수 밖 에 없어 요.
 
#include <iostream>

#include <cstring>

#include <cstdio>



using namespace std;



const int MAXN = 100 + 28;

int dp[15][MAXN];

int workers[15];



inline int Min( int a, int b )

{

    return a<b ? a : b;

}



int main()

{

    int N;

    int hire, salary, fire;

    int maxC;

    int i, j, k;

    int minC;

    while( scanf("%d",&N)!=EOF && N )

    {

        scanf("%d%d%d", &hire, &salary, &fire);

        maxC = -1;

        for( i=1;i<=N;i++ )

        {

            scanf("%d",&workers[i]);

            maxC = maxC<workers[i] ? workers[i] : maxC;

        }

        for( i=workers[1];i<=maxC;i++ )

            dp[1][i] = hire*i + salary*i;

        for( i=2;i<=N;i++ )

        {

            for( j=workers[i];j<=maxC;j++ )

            {

                //                              

                minC = 65552365;

                for( k=workers[i-1];k<=maxC;k++ )

                {

                    if( j>k )

                        minC = Min( minC, dp[i-1][k]+(j-k)*hire+j*salary );

                    else if( k>=j )

                        minC = Min( minC, dp[i-1][k]+(k-j)*fire+j*salary );

                }

                dp[i][j] = minC;

            }

        }

        minC = 65523365;

        for( i=workers[N];i<=maxC;i++ )

            minC = Min( minC, dp[N][i] );

        printf("%d
", minC); } return 0; }

좋은 웹페이지 즐겨찾기