zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    51 Nod 1086 多重背包问题(单调队列优化)
    51 Nod 1086 多重背包问题(二进制优化)
    51 Nod 1085 01背包问题
    poj 2559 Largest Rectangle(单调栈)
    51 Nod 1089 最长回文子串(Manacher算法)
    51 Nod N的阶乘的长度 (斯特林近似)
    51 Nod 1134 最长递增子序列(经典问题回顾)
    51 Nod 1020 逆序排列
    PCA-主成分分析(Principal components analysis)
    Python中cPickle
  • 原文地址:https://www.cnblogs.com/lhclqslove/p/9335235.html
Copyright © 2011-2022 走看看