p1454.cpp

来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· C++ 代码 · 共 50 行

CPP
50 行
字号
#include <stdio.h>

int     N , InCome , GoOut , Pay , max;
int     Month [13];
int     Opt [13] [1001];

int     Dp ()
{
        int     i , j , k , t;
        for ( i = 1; i <= max; i ++ ) Opt [0] [i] = 99999;
        Opt [0] [0] = 0;

        for ( i = 1; i <= N; i ++ ) {
                for ( j = 0; j <= max; j ++ ) {
                        Opt [i] [j] = 9999999;
                        if ( j < Month [i] ) continue;
                        for ( k = 0; k <=j; k ++ ) {
                                t = Opt [i - 1] [k] + InCome * ( j - k );
                                if ( t < Opt [i] [j] ) Opt [i] [j] = t;
                        }
                        for ( k = j + 1; k <= max; k ++ ) {
                                t = Opt [i - 1] [k] + GoOut * ( k - j );
                                if ( t < Opt [i] [j] ) Opt [i] [j] = t;
                        }
                        Opt [i] [j] += j * Pay;
                }
        }
        int ret = 9999999;
        for ( i = 0; i <= max; i ++ )
                if ( Opt [N] [i] < ret )
                        ret = Opt [N] [i];
        return ret;
}

main ()
{
        freopen ( "p.in" , "r" , stdin );
        freopen ( "p.out" , "w" , stdout );
        
        int     i;
        while ( scanf ( "%d" , &N ) , N ) {
                scanf ( "%d %d%d" , &InCome , &Pay , &GoOut );
                for ( max = 0 , i = 1; i <= N; i ++ ) {
                        scanf ( "%d" , &Month [i] );
                        if ( Month [i] > max ) max = Month [i];
                }
                printf ( "%d\n" , Dp () );
        }
}
 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?