码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #145 (Div. 1, ACM-ICPC Rules)B dp

时间:2015-04-21 22:39:28      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:

///dp[i][j][0] 表示前i列涂了j个red且第j列是red得到最少的valul
//dp[i][j][1]表示第i列涂了j个red且第j列是green得到的最少的value
//dp[i][j][0] = min(dp[i-1][j-h[i]][0] , dp[i][j][1] + min(h[i-1] ,h[i]))
//dp[i][j][1] = min(dp[i-1][j][0] + min(h[i-1],h[i]) ,dp[i][j][1])
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std ;
const int inf = 0x3f3f3f3f;
const int maxn  = 210 ;
int dp[maxn][maxn*maxn][2]; //dp[i][j][0] 表示第i列去了j个a且第j列是a得到最少的value
int sum[maxn];
int h[maxn];
int Min(int a ,int b)
{
    if(a == -1)
    return b;
    if(b == -1)
    return a;
    return min(a,b);
}
int main()
{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    int n , a, b;
    while(~scanf("%d" ,&n))
    {
        scanf("%d%d" ,&a ,&b);
        sum[0] = 0 ;
        for(int i = 1;i <= n;i++)
        scanf("%d" ,&h[i]) , sum[i]=sum[i-1]+h[i];
        memset(dp , -1 , sizeof(dp));
        if(h[1] <= a)
            dp[1][h[1]][0] = 0;
        if(h[1] <= b)
        dp[1][0][1] = 0 ;
        for(int i = 1;i < n;i++)
        {
            if(sum[i] <= b)
            dp[i][0][1] = 0;
            for(int j = 0;j <= a;j++)
            {
               if(dp[i][j][0] != -1)
               {
                    if(j+h[i+1] <= a)
                    dp[i+1][j+h[i+1]][0] = Min(dp[i+1][j+h[i+1]][0] , dp[i][j][0]);
                    if(sum[i+1] - j <= b)
                    dp[i+1][j][1] = Min(dp[i+1][j][1] , dp[i][j][0] + min(h[i] ,h[i+1]));
               }
               if(dp[i][j][1] != -1)
               {
                   if(j+h[i+1] <= a)
                   dp[i+1][j+h[i+1]][0] = Min(dp[i+1][j+h[i+1]][0] , dp[i][j][1] + min(h[i] ,h[i+1]));
                   if(sum[i+1] - j <= b)
                   dp[i+1][j][1] = Min(dp[i+1][j][1] , dp[i][j][1]);
               }
            }
        }
        int ans = inf ;
        for(int i = 0;i <= a;i++)
        ans = Min(Min(ans ,dp[n][i][0]) , dp[n][i][1]);
        if(ans == inf)puts("-1");
        else printf("%d\n",ans);
    }
}



























Codeforces Round #145 (Div. 1, ACM-ICPC Rules)B dp

标签:

原文地址:http://blog.csdn.net/cq_pf/article/details/45177309

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!