zoukankan      html  css  js  c++  java
  • 2019杭电多校一 A. Blank (dp)

    大意: 长为$n$的数组, 每个位置范围$[0,3]$, $m$个限制$(l,r,x)$表示$[l,r]$内有$x$种数, 求方案数.

    维护每个数字最后一次出现位置, 暴力$DP$

    实现时有个技巧是把还没有选择的数位置设为$0$

    #include <iostream>
    #include <cstdio>
    #include <queue>
    #define REP(i,a,n) for(int i=a;i<=n;++i)
    #define PER(i,a,n) for(int i=n;i>=a;--i)
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pii;
    const int N = 110, P = 998244353;
    int n, m;
    vector<pii> f[N];
    int dp[N][N][N][N];
    void add(int &x, int y) {x+=y;if (x>=P)x-=P;}
    int main() {
    	int t;
    	cin>>t;
    	while (t--) {
    		cin>>n>>m;
    		REP(i,1,n) f[i].clear();
    		while (m--) {
    			int l,r,x;
    			cin>>l>>r>>x;
    			f[r].pb(pii(l,x));
    		}
    		int cur = 0, ans = 0;
    		dp[0][0][0][0] = 1;
    		REP(i,1,n) {
    			cur ^= 1;
    			REP(j,0,i) REP(k,0,j) REP(t,0,k) dp[cur][j][k][t]=0;
    			REP(j,0,i-1) REP(k,0,j) REP(t,0,k) {
    				int &r = dp[!cur][j][k][t];
    				if (!r) continue;
    				add(dp[cur][j][k][t],r);
    				add(dp[cur][i-1][j][k],r);
    				add(dp[cur][i-1][j][t],r);
    				add(dp[cur][i-1][k][t],r);
    			}
    			REP(j,0,i-1) REP(k,0,j) REP(t,0,k) {
    				for (auto u:f[i]) { 
    					if (1+(j>=u.x)+(k>=u.x)+(t>=u.x)!=u.y) {
    						dp[cur][j][k][t] = 0;
    					}
    				}
    				if (i==n) add(ans,dp[cur][j][k][t]);
    			}
    		}
    		printf("%d
    ", ans);
    	}
    }
    
  • 相关阅读:
    P3822 [NOI2017]整数
    P4630 [APIO2018] Duathlon 铁人两项
    P3230 [HNOI2013]比赛
    P2570 [ZJOI2010]贪吃的老鼠
    P4576 [CQOI2013]棋盘游戏
    P3256 [JLOI2013]赛车
    P3297 [SDOI2013]逃考
    CF487E Tourists
    设置一个双色球脚本(2)并带颜色输出
    设置一个双色球脚本
  • 原文地址:https://www.cnblogs.com/uid001/p/11228589.html
Copyright © 2011-2022 走看看