题目链接: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 }