• luogu P1564 膜拜 |动态规划


    题目描述

    神牛有很多…当然…每个同学都有自己衷心膜拜的神牛.

    某学校有两位神牛,神牛甲和神牛乙。新入学的N 位同学们早已耳闻他们的神话。

    所以,已经衷心地膜拜其中一位了。现在,老师要给他们分机房。但是,要么保证整个机房都是同一位神牛的膜拜者,或者两个神牛的膜拜者人数差不超过M。另外,现在N位同学排成一排,老师只会把连续一段的同学分进一个机房。老师想知道,至少需要多少个机房。

    输入格式

    输入文件第一行包括N 和M。

    之后N 行,每行一个整数,1 表示神牛甲的崇拜者,2 表示神牛乙的崇拜者。

    输出格式

    输出一个整数,表示最小需要机房的数量。

    .

    直接O( n²)的动态规划

    f[i]表示前i个人分的最少的机房

    细节请看代码

    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define int long long
    using namespace std;
    const int N=2515;
    int f[N],s1[N],s2[N];
    signed main(){
    	int n,m;
    	cin>>n>>m;
    	for(int i=1,x;i<=n;i++){
    		s1[i]=s1[i-1];//前缀和
    		s2[i]=s2[i-1];
    		scanf("%lld",&x);
    		if(x==1)s1[i]++;
    		else s2[i]++;
    		f[i]=1e9;//初始化
    		for(int j=0;j<i;j++)//判断是否满足条件
    		if(s1[i]-s1[j]==0||s2[i]-s2[j]==0||abs(s1[i]-s1[j]-(s2[i]-s2[j]))<=m)
    		f[i]=min(f[i],f[j]+1);//判断分一个机房更优,或不分更优
    	}
    	cout<<f[n]<<endl;
    }
    
    不以物喜,不以己悲
  • 相关阅读:
    8-4:Mysql数据库编程基础知识
    adb——Android的ADB工具使用
    BroadcastReceiver--Android广播机制
    怎样投篮更准
    《算法七》(深度寻路算法)
    《算法六》(有序二叉树)
    《算法五》(N叉树定义+增删改查)
    《算法四》(二分排序+汉诺塔问题)
    《算法三》(归并排序)
    《算法二》(希尔排序+基数排序+桶排序)
  • 原文地址:https://www.cnblogs.com/naruto-mzx/p/11602091.html
Copyright © 2020-2023  润新知