zoukankan      html  css  js  c++  java
  • CF771E Bear and Rectangle Strips【贪心,dp】

    给定 (2 imes n) 的矩阵 (t),求最多能切分出多少个和为 (0) 的连续子矩阵。

    (nle 3cdot 10^5)(|t_{i,j}|le 10^9)


    朴素的想法是按列 dp,设 (f_{i,j}) 表示只考虑第一行前 (i) 格和第二行前 (j) 格时的答案,(s_{0/1/2,i}) 表示两行/第一行/第二行的前缀和,(p_{0/1/2,i}) 表示最大的 (j) 使得存在 (j<kle i)(s_j=s_k),则有 (f_{i,j}=max{f_{i,p_{2,j}},f_{p_{1,i},j},f_{k,k}}+1),其中 (k=p_{0,min(x,y)}),分别对应三种决策。复杂度 (O(n^2))

    然后就自闭了,正解是神必贪心:若 (p_{1,i}ge p_{2,j}),则选了第二行 ((p_{2,j},j]) 就一定要选第一行 ((p_{1,i},i]),所以只用算 (f_{p_{1,i},j})(p_{1,i}<p_{2,j}) 时同理。

    结果记搜一下就过了,因为对于某个 (i),状态只用到了 (f_{i,i})(f_{i,j}=f_{i,i}+1) 的某个 (j)(f_{j,i}=f_{i,i}+1) 的某个 (j),所以状态数只有 (O(n)),时间复杂度 (O(nlog n))(O(n))

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int N = 300003;
    template<typename T>
    void rd(T &x){
    	int ch = getchar(); bool f = false; x = 0;
    	for(;ch < '0' || ch > '9';ch = getchar()) f |= ch == '-';
    	for(;ch >= '0' && ch <= '9';ch = getchar()) x = x * 10 + ch - '0';
    	if(f) x = -x;
    }
    template<typename T>
    bool chmax(T &a, const T &b){if(a < b) return a = b, 1; return 0;}
    int n, p[3][N]; LL s[3][N];
    unordered_map<LL, int> v[3];
    unordered_map<int, int> f[N];
    int calc(int x, int y){
    	if(x < 0 || y < 0) return -1e9;
    	if(f[x].count(y)) return f[x][y];
    	int t = p[0][min(x,y)];
    	return f[x][y] = max(0, 1 + max(p[1][x]>p[2][y]?calc(p[1][x],y):calc(x,p[2][y]), calc(t,t)));
    }
    int main(){
    	rd(n);
    	for(int i = 1;i <= 2;++ i)
    		for(int j = 1;j <= n;++ j){
    			rd(s[i][j]); s[i][j] += s[i][j-1];
    		}
    	memset(p, -1, sizeof p);
    	v[0][0] = v[1][0] = v[2][0] = 0;
    	for(int i = 1;i <= n;++ i){
    		s[0][i] = s[1][i] + s[2][i];
    		for(int j = 0;j < 3;++ j){
    			p[j][i] = p[j][i-1];
    			if(v[j].count(s[j][i]))
    				chmax(p[j][i], v[j][s[j][i]]);
    			v[j][s[j][i]] = i;
    		}
    	} f[0][0] = 0;
    	printf("%d
    ", calc(n, n));
    }
    
  • 相关阅读:
    解决tomcat服务器跨域问题
    HashMap数据结构面试
    Gitlab,jenkins 安装及配置 【CICD】
    linux虚拟机——基本操作指令
    MYSQL优化思路总结
    DeepFaceLab:快让rtx30系列的提取速度翻倍吧!!!
    Google Colab V100 +TensorFlow1.15.2 性能测试
    滴滴云A100 40G+TensorFlow1.15.2 +Ubuntu 18.04 性能测试
    矩池云 RTX 2080 Ti+Ubuntu18.04+Tensorflow1.15.2 性能测试!
    NVIDIA A100跑DeepFaceLab,日迭代破百万,像素上800!
  • 原文地址:https://www.cnblogs.com/AThousandMoons/p/14939147.html
Copyright © 2011-2022 走看看