• 【arc074e】RGB Sequence(动态规划)


    【arc074e】RGB Sequence(动态规划)

    题面

    atcoder
    洛谷
    翻译见洛谷

    题解

    直接考虑暴力(dp),设(f[i][j][k][l])表示当前考虑到第(i)位,最后一个红绿蓝色出现的位置是哪里,发现显然(i=max(j,k,l)),所以只有三维了,直接(dp)即可。至于限制每次在右端点考虑一下就好了。

    #include<iostream>
    #include<cstdio>
    #include<vector>
    using namespace std;
    #define MAX 330
    #define MOD 1000000007
    inline int read()
    {
    	int x=0;bool t=false;char ch=getchar();
    	while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    	if(ch=='-')t=true,ch=getchar();
    	while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    	return t?-x:x;
    }
    void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
    int n,m,f[MAX][MAX][MAX],ans;
    struct Node{int l,x;};
    vector<Node> e[MAX];
    bool check(int a,int b,int c)
    {
    	int r=max(a,max(b,c));
    	for(int i=0,t=e[r].size();i<t;++i)
    	{
    		int l=e[r][i].l,x=e[r][i].x,s=0;
    		s=(a>=l)+(b>=l)+(c>=l);
    		if(s!=x)return false;
    	}
    	return true;
    }
    int main()
    {
    	n=read();m=read();
    	for(int i=1;i<=m;++i)
    	{
    		int l=read(),r=read(),x=read();
    		e[r].push_back((Node){l,x});
    	}
    	f[0][0][0]=1;
    	for(int i=0;i<=n;++i)
    		for(int j=0;j<=n;++j)
    			for(int k=0;k<=n;++k)
    			{
    				if(!f[i][j][k])continue;
    				if((i&&k&&i==k)||(i&&j&&i==j)||(j&&k&&j==k))continue;
    				if(!check(i,j,k)){f[i][j][k]=0;continue;}
    				int r=max(i,max(j,k));
    				add(f[r+1][j][k],f[i][j][k]);
    				add(f[i][r+1][k],f[i][j][k]);
    				add(f[i][j][r+1],f[i][j][k]);
    				if(r==n)add(ans,f[i][j][k]);
    			}
    	printf("%d
    ",ans);
    	return 0;
    }
    
    
  • 相关阅读:
    表单的编辑添加和删除 .removeClass() .append() .preAll() .attr('b') document.createElement()
    菜单与内容下拉jQuery
    s2选择框的全选和反选jQuery
    作用域
    当前触发事件的两种方式(onclick) 和 ('id') 获取
    词义分析
    Qt下载地址
    字符集(编码)转换_Qt532_QString
    字符集(编码)转换_Windows
    字符集(编码)转换_Linux
  • 原文地址:https://www.cnblogs.com/cjyyb/p/9713769.html
Copyright © 2020-2023  润新知