NC21675Rabbit的工作(1)

Rabbit的工作(1)

https://ac.nowcoder.com/acm/problem/21675

链接:https://ac.nowcoder.com/acm/problem/21675
来源:牛客网

题目描述

Rabbit大学毕业后找到了一份实习工作,如果实习通过她就转正了。
实习期共有N天,其中有几天公司集体放假,Rabbit不用上班,剩下时间她可以选择工作或者休息。Rabbit工作总是越来越累,可是每当她休息时,她就重新充满了能量。简而言之,Rabbit第一天工作时这一天会消耗体力1,连续第二天工作时这一天会消耗体力2,连续第三天工作时这一天会消耗体力3,以此类推......每当她休息后,工作的第一天又会消耗体力1。
为了让boss满意,Rabbit想工作尽量多的天数,但是懒惰的Rabbit又想让自己的总体力消耗不超过K。

输入描述:

第一行两个整数N,K。

第二行一个长度为N的01字符串。如果第i个字符为‘1’,表示这一天Rabbit可以选择工作或者休息,否则这一天Rabbit放假。

输出描述:

输出Rabbit最多能工作的天数。

思路:

天工作天且连续工作

  • 分情况讨论:

​ 当字符为0时,此天休息,

​ 当字符为1时,此天可以工作也可以休息,休息同上。

​ 工作时:

为减少维度,采用滚动数组,观察状态转移方程知只和有关为省去此维度就倒序,类似于01背包的降维滚动。

  • 降维:

表示工作天且连续

​ 当休息时:

​ 当工作时:

其中可正序枚举也可逆序枚举

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define DOF 0x7f7f7f7f
#define endl '\n'
#define mem(a,b) memset(a,b,sizeof(a))
#define debug(case,x); cout<<case<<"  : "<<x<<endl;
#define open freopen("ii.txt","r",stdin)
#define close freopen("oo.txt","w",stdout)
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
typedef long long ll;
using namespace std;
const int maxn = 2e5 + 10;
int dp[410][410];
string str;
int main(){
    int n, k;
    cin >> n >> k;
    cin >> str;
    for(int i=0;i<=n;++i){
        for(int j=0;j<=n;++j){
            dp[i][j]=0x7f7f7f7f;
        }
    }
    dp[0][0]=0;
    for(int i = 1; i <= n; ++i) {
        for(int j = i; j > 0; --j) {
            for(int k = 1; k <= j; ++k) {
                if(str[i - 1] == '0') {
                    dp[j][0] = min(dp[j][0], dp[j][k]);
                } else {
                    dp[j][0] = min(dp[j][0], dp[j][k]);
                    dp[j][k] = min(dp[j][k], dp[j - 1][k - 1] + k);
                }
            }
        }
    }
    int ans = 0;
    for(int i = 1; i <= n; ++i) {
        for(int j = 1; j <= n; ++j) {
            if(dp[i][j] <= k) {
                ans = i;
            }
        }
    }
    cout << ans << endl;
}

全部评论

相关推荐

CVTE校招内推:可以试试我们这,硬件还没招满
点赞 评论 收藏
分享
zhiyog:哈哈哈,其实是津巴布韦币
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务