Codeforces946D Timetable

题意:输入n,m,k代表n天,每天m节课,每天要从第一节课待到最后一节课结束,n天一共可以逃k节课,问最少在学校待多久?

题解:每天逃课节数和n天的上限的最小价值,也就是背包,这里是分组背包,每天逃课的节数作为物品,也就是n组只能选件物品,每天必须选一件

dp[i][j]代表前i天逃j节课的最小价值

#include <bits/stdc++.h>
#define maxn 510
#define INF 0x3f3f3f3f
using namespace std;
int n, m, k, a[maxn], c[maxn][maxn], dp[maxn][maxn];
char s[maxn];
int main(){
    scanf("%d%d%d", &n, &m, &k);
    for(int i=1;i<=n;i++){
        scanf("%s", s);
        int num = 0;
        for(int j=0;j<m;j++){
            if(s[j] == '1')
                a[++num] = j;
        }
        for(int j=0;j<num;j++){
            c[i][j] = a[num]-a[1]+1;
            for(int l=0;l<=j;l++){
                c[i][j] = min(c[i][j], a[num-j+l]-a[l+1]+1);
            }
        }
        c[i][num] = 0;
    }
    memset(dp, INF, sizeof(dp));
    dp[0][0] = 0;
    for(int i=1;i<=n;i++){
        for(int j=0;j<=k;j++){
            for(int l=0;l<=j;l++){
                dp[i][j] = min(dp[i][j], dp[i-1][j-l]+c[i][l]);
            }
        }
    }
    printf("%d\n", dp[n][k]);
    return 0;
}

 

posted on 2018-03-22 13:47  2855669158  阅读(162)  评论(0编辑  收藏  举报

导航