Educational Codeforces Round 39 (Rated for Div. 2)D. Timetable

题目链接:D. Timetable

题解:预处理然后分组背包a[i][j]表示第i天翘掉j节课可以不去学校的时间,预处理出a[][]数组之后,就是容量为k,对着n天进行分组背包 dp[i]表示旷i节课可以不去学校的时间

 1 #include<bits/stdc++.h>
 2 #include<set>
 3 #include<cstdio>
 4 #include<iomanip>
 5 #include<iostream>
 6 #include<string>
 7 #include<cstring>
 8 #include<algorithm>
 9 #define pb push_back
10 #define ll long long
11 #define fi first
12 #define se second
13 #define PI 3.14159265
14 #define ls l,m,rt<<1
15 #define rs m+1,r,rt<<1|1
16 #define eps 1e-7
17 #define pii pair<int,int>
18 typedef unsigned long long ull;
19 const int mod=1e3+5;
20 const ll inf=0x3f3f3f3f3f3f3f;
21 const int maxn=5e2+5;
22 using namespace std;
23 int n,m,cnt,k;
24 string s;
25 int pos[maxn][maxn],a[maxn][maxn],num[maxn],dp[maxn];
26 int main()
27 {
28     ios::sync_with_stdio(false);
29     cin.tie(0);cout.tie(0);
30     cin>>n>>m>>k;
31     for(int i=1;i<=n;i++)
32     {
33         cin>>s;
34         for(int j=0;j<s.size();j++)
35         {
36             if(s[j]=='1')
37             {
38                 pos[i][++num[i]]=j;
39             }
40         }
41     }
42 //    for(int i=1;i<=n;i++)
43 //    {
44 //        for(int j=0;j<=num[i];j++)
45 //        {
46 //            cout<<pos[i][j]<<" ";
47 //        }cout<<endl;
48 //    }
49     for(int i=1;i<=n;i++)
50     {
51         if(num[i]==0)
52         {
53             a[i][0]=m;
54         }
55         else
56         for(int j=0;j<=k&&j<=num[i];j++)
57         {
58             for(int l=0;l<=j;l++)
59             {
60              //   cout<<i<<"SSS"<<l<<" "<<pos[i][l+1]<<" "<<" "<<m-1-pos[i][num[i]-(j-l)]<<endl;
61                 if(j<num[i])a[i][j]=max(a[i][j],m-1-pos[i][num[i]-(j-l)]+pos[i][l+1]);
62                 else a[i][j]=m;
63             }
64         }
65     }
66 //    for(int i=1;i<=n;i++)
67 //    {
68 //        for(int j=0;j<=num[i];j++)
69 //        {
70 //            cout<<a[i][j]<<" ";
71 //        }cout<<endl;
72 //    }
73     for(int i=1;i<=n;i++)
74     {
75         for(int j=k;j>=0;j--)
76         {
77             for(int l=0;l<=num[i];l++)
78             {
79                 if(j>=l)dp[j]=max(dp[j],dp[j-l]+a[i][l]);
80             }
81         }
82     }
83     cout<<n*m-dp[k]<<endl;
84     return 0;
85 }
View Code

 

posted @ 2018-07-19 13:17  lhclqslove  阅读(124)  评论(0编辑  收藏  举报