cf_234/F Fence

来源:互联网 发布:linux安装phpmyadmin 编辑:程序博客网 时间:2024/06/07 06:59
開四維數組肯定超出內存限制和時間限制的,這裏要聯繫到如果知道塗上了紅色多少,就可以計算出綠色,這樣狀態的維數就減少了狀態dp[x][y][z] 表示前x個,紅色的面積爲y,第x個顏色爲z#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define RED     0#define COLOR   2#define MAXN    201#define MAXV    40001#define INF     0x3f3f3f3fint f[MAXN][MAXV][COLOR], h[MAXN], sum[MAXN];int main(int argc, char const *argv[]){        freopen("input.txt", "r", stdin);        freopen("output.txt", "w", stdout);        int n, area[COLOR], rst; sum[0] = h[0] = 0;        while( ~scanf("%d %d %d", &n, &area[0], &area[1]) ) {                for(int i = 1; i <= n; i ++) {                        scanf("%d", &h[i]); sum[i] = sum[i-1]+h[i];                }                if( 1 == n ) {                        if( area[0] < h[1] && area[1] < h[1] ) {                                printf("-1\n"); continue;                        }                        printf("0\n");                }                memset(f, 0x3F, sizeof(f));                if( area[!RED] >= h[1] ) {                        f[1][0][!RED] = 0;                }                if( area[RED] >= h[1] ) {                        f[1][0][RED] = 0;                }                for(int i = 1; i <= n; i ++) {                        for(int j = 0; j <= sum[i-1]; j ++) {                                if( area[RED]-j >= h[i] ) {                                        f[i][j][RED] = min(f[i][j][RED], f[i-1][j][!RED]+min(h[i], h[i-1]));                                        f[i][j][RED] = min(f[i][j][RED], f[i-1][j-h[i-1]][RED]);                                }                                if( area[!RED]-sum[i-1]+j >= h[i] ) {                                        f[i][j][!RED] = min(f[i][j][!RED], f[i-1][j][!RED]);                                        f[i][j][!RED] = min(f[i][j][!RED], f[i-1][j-h[i-1]][RED]+min(h[i], h[i-1]));                                }                        }                }                rst = INF;                for(int i = 0; i <= sum[n]; i ++) {                        rst = min(rst, min(f[n][i][!RED], f[n][i][RED]));                }                if( INF == rst ) {                         printf("-1\n"); continue;                }                printf("%d\n", rst);        }        return 0;}