zoukankan      html  css  js  c++  java
  • [BZOJ 3791] 作业 【DP】

    题目链接:BZOJ - 3791

    题目分析

    一个性质:将一个序列染色 k 次,每次染连续的一段,最多将序列染成 2k-1 段不同的颜色。

    那么就可以 DP 了,f[i][j][0|1] 表示到第 i 个位置,染了 j 段,当前这一段颜色为 0|1 的最大价值。

    f[i][][] 只与 f[i-1][][] 有关,第一维用滚动数组就可以了。

    代码

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <cmath>
    #include <algorithm>
    
    using namespace std;
    
    const int MaxN = 100000 + 5, MaxM = 100 + 5;
    
    inline void Read(int &Num) {
    	char c; c = getchar();
    	while (c < '0' || c > '9') c = getchar();
    	Num = c - '0'; c = getchar();
    	while (c >= '0' && c <= '9') {
    		Num = Num * 10 + c - '0';
    		c = getchar();
    	}
    }
    
    inline int gmax(int a, int b) {return a > b ? a : b;}
    
    int n, m, Ans;
    int A[MaxN], f[3][MaxM][3];
    
    int main() 
    {
    	Read(n); Read(m);
    	for (int i = 1; i <= n; ++i) Read(A[i]);
    	int Now = 0, Last = 1;
    	m = m * 2 - 1;
    	Ans = 0;
    	for (int i = 1; i <= n; ++i) {
    		for (int j = 1; j <= m; ++j) {
    			f[Now][j][0] = gmax(f[Last][j][0], f[Last][j - 1][1]);
    			f[Now][j][1] = gmax(f[Last][j][1], f[Last][j - 1][0]);
    			if (A[i] == 0) ++f[Now][j][0];
    			else ++f[Now][j][1];
    			Ans = gmax(Ans, f[Now][j][0]);
    			Ans = gmax(Ans, f[Now][j][1]);
    		}
    		Now ^= 1; Last ^= 1;
    	}
    	printf("%d
    ", Ans);
    	return 0;
    }
    

      

  • 相关阅读:
    基于jquery的web在线流程图设计器gooFlow
    angularJS学习笔记二
    angularJS学习笔记一
    JavaScript作用域链详解
    图片查看器(可拖拽,缩放,轮播)
    小议window.event || ev
    Vue安装准备工作
    让VS2013添加新类时自动添加public关键字
    win10太垃圾,真的不好用。
    Bind 和 ScaffoldColumn[转]
  • 原文地址:https://www.cnblogs.com/JoeFan/p/4263182.html
Copyright © 2011-2022 走看看