D. Timetable
http://codeforces.com/problemset/problem/946/D
Ivan is a student at Berland State University (BSU). There arendays in Berland week, and each of these days Ivan might have some classes at the university.
There aremworking hours during each Berland day, and each lesson at the university lasts exactly one hour. If at some day Ivan's first lesson is duringi-th hour, and last lesson is duringj-th hour, then he spendsj?-?i?+?1hours in the university during this day. If there are no lessons during some day, then Ivan stays at home and therefore spends0hours in the university.
Ivan doesn't like to spend a lot of time in the university, so he has decided to skip some lessons. He cannot skip more thanklessons during the week. After deciding which lessons he should skip and which he should attend, every day Ivan will enter the university right before the start of the first lesson he does not skip, and leave it after the end of the last lesson he decides to attend. If Ivan skips all lessons during some day, he doesn't go to the university that day at all.
Givenn,m,kand Ivan's timetable, can you determine the minimum number of hours he has to spend in the university during one week, if he cannot skip more thanklessons?
Input
The first line contains three integersn,mandk(1?≤?n,?m?≤?500,0?≤?k?≤?500) — the number of days in the Berland week, the number of working hours during each day, and the number of lessons Ivan can skip, respectively.
Thennlines follow,i-th line containing a binary string ofmcharacters. Ifj-th character ini-th line is1, then Ivan has a lesson oni-th day duringj-th hour (if it is0, there is no such lesson).
Output
Print the minimum number of hours Ivan has to spend in the university during the week if he skips not more thanklessons.
Examples
input
Copy
2 5 1
01001
10110
output
5
input
Copy
2 5 0
01001
10110
output
8
Note
In the first example Ivan can skip any of two lessons during the first day, so he spends1hour during the first day and4hours during the second day.
In the second example Ivan can't skip any lessons, so he spends4hours every day.
// 去吧!皮卡丘! 把AC帶回來!
// へ /|
// /\7 ∠_/
// / │ / /
// │ Z _,< / /`ヽ
// │ ヽ / 〉
// Y ` / /
// ?● ? ● ??〈 /
// () へ | \〈
// >? ?_ ィ │ //
// / へ / ?<| \\
// ヽ_? (_/ │//
// 7 |/
// >―r ̄ ̄`?―_
//**************************************
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define inf 2147483647
const ll INF = 0x3f3f3f3f3f3f3f3fll;
#define ri register int
template <class T> inline T min(T a, T b, T c) { return min(min(a, b), c); }
template <class T> inline T max(T a, T b, T c) { return max(max(a, b), c); }
template <class T> inline T min(T a, T b, T c, T d) {
return min(min(a, b), min(c, d));
}
template <class T> inline T max(T a, T b, T c, T d) {
return max(max(a, b), max(c, d));
}
#define pi acos(-1)
#define mem(x, y) memset(x, y, sizeof(x));
#define For(i, a, b) for (int i = a; i <= b; i++)
#define FFor(i, a, b) for (int i = a; i >= b; i--)
#define bug printf("***********
");
#define mp make_pair
#define pb push_back
const int maxn = 3e5 + 10;
// name*******************************
int n, m;
int a[505][505];
int K;
int kk[505][505];//kk[i][j]記錄第i行刪掉j個的最小代價,為后面dp服務
int dp[505][505];//dp[i][j]:前i行,共刪掉j個所獲最下代價
int cnt[505];//記錄每組的1的個數
int sum=0; //sum這里記錄下1的總個數,若K大于sum,直接輸出0
// function******************************
//***************************************
int main() {
// ios::sync_with_stdio(0); cin.tie(0);
// freopen("test.txt", "r", stdin);
// freopen("outout.txt","w",stdout);
cin >> n >> m >> K;
me(dp, 127);
me(kk, 127);
For(i, 1, n) {
For(j, 1, m) {
int x;
scanf("%1d", &x);//限寬輸入
if (x) {
a[i][++cnt[i]] = j;
}
}
//選定j,k為起始終止點
For(j, 1, cnt[i]) {
For(k, j, cnt[i]) {
kk[i][(j - 1) + cnt[i] - k] =
min(kk[i][(j - 1) + cnt[i] - k], a[i][k] - a[i][j] + 1);
}
}
kk[i][cnt[i]] = 0;
sum+=cnt[i];
}
if(K>=sum){
cout<<0;
return 0;
}
For(i, 0, min(K, cnt[1])) {
dp[1][i] = kk[1][i];
}
For(i, 2, n) {
For(j, 0, K) {
For(k, 0, min(j,cnt[i])) {
dp[i][j] = min(dp[i][j], dp[i - 1][j - k] + kk[i][k]);
}
}
}
cout << dp[n][K];
return 0;
}
總結
以上是生活随笔為你收集整理的D. Timetable的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++矩阵类_数据结构-JavaScri
- 下一篇: button按钮onclick触发不了_