zoukankan      html  css  js  c++  java
  • 洛谷P4063 [JXOI2017]数列(dp)

    题意

    题目链接

    Sol

    这题想还是不难想的,就是写起来很麻烦,然后去看了一下loj的最短代码表示只能Orz

    首先不难发现一条性质:能够选择的区间一定是不断收缩的,而且新的可选区间一定是旧区间的某个位置划分而来的。

    比如(A_{i-1} = x),此时小于(x)的最大数为(l_{i-1}),大于(x)的最小数为(r_{i-1}),我在这之中选了一个(A_i = t),那么我们考虑(A_{i+1})的时候。显然若(t < x),那么大于(t)的最小数为(x),小于(t)的最大数为(l)(t>x)同理。

    然后就可以设(f[i][l][r])表示(i)位置在([l,r])内取值的方案数。转移的时候需要倒着转移。

    直接记忆话搜索即可

    复杂度(O(nr^3))

    #include<bits/stdc++.h>
    #define Fin(x) freopen(#x".in", "r", stdin);
    using namespace std;
    const int MAXN = 50001, mod = 998244353;
    template<typename A, typename B> inline bool chmax(A &x, B y) {return x < y ? x = y, 1 : 0;}
    template<typename A, typename B> inline bool chmin(A &x, B y) {return x > y ? x = y, 1 : 0;}
    template<typename A, typename B> inline A mul(A x, B y) {return 1ll * x * y % mod;}
    template<typename A, typename B> inline void add2(A &x, B y) {x = x + y >= mod ? x + y - mod : x + y;}
    template<typename A, typename B> inline int add(A x, B y) {return x + y >= mod ? x + y - mod : x + y;}
    inline int read() {
    	char c = getchar(); int x = 0, f = 1;
    	while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
    	while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    	return x * f;
    }
    int N, a[51], f[51][152][152];
    int dfs(int x, int l, int r) {
    	if(x > N) 
    		return 1;
    	int &res = f[x][l][r];
    	if(~res) return res; res = 0;
    	for(int i = max(1, l); i <= min(a[x], r); i++) {
    		if(i == l || i == r) add2(res, dfs(x + 1, i, i));
    		else add2(res, add(add(dfs(x + 1, l, i), dfs(x + 1, i, r)), -dfs(x + 1, i, i) + mod));
    	}
    	return res;
    }
    signed main() {
    	memset(f, -1, sizeof(f));
    	N = read();
    	int mx = 0;
    	for(int i = 1; i <= N; i++) a[i] = read(), chmax(mx, a[i]);
    	cout << dfs(1, 0, mx + 1);
    	return 0;
    }
    
  • 相关阅读:
    using vb.net export a datatable to Excel and save as file
    selection sort with objective c
    stdin和STDIN_FILENO的区别
    stdin和STDIN_FILENO的区别
    linux系统kbhit的几种实现
    成为掌握企业聘用趋势的人才
    linux系统kbhit的几种实现
    c_lflag中ICANON的作用
    常量字符串的问题
    mmsbitfields gcc和vc关于位域那点事
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/10440440.html
Copyright © 2011-2022 走看看