• POJ2279 Mr Young's Picture Permutations


    题意:

    • 见p263(进阶指南)

    输入:

    • 本题有多组数据,示例如下
    • while(cin>>k){
          if(k==0) break;
          memset(n,0,sizeof(n));
          for(int i=1;i<=k;i++)
          cin>>n[i];
      }
      

    个人思路:

    •  首先设置状态,由数据范围可知设为f[a][b][c][d][e]即可
    • 对于每个状态,它都包含它的子状态
    • 例如:(3 2 0 0 0)包含(2 2 0 0 0)和(3 1 0 0 0)
    • 可以想到,无论子状态里面有多少种可能,较大的状态都可以完美包含这些状态
    • 通过这样的子问题的不断重叠,可以发现原问题形成了一个拓扑序的结构
    • 像这样的结构我们发现可以直接用类似f[a][b][c][d][e]+=f[a-1][b][c][d][e]这样的方式进行转移
    • 另外,注意一下开long long

    题目地址:[Contest Hunter]Mr Young's Picture Permutations


    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    const int MAXN=1000010;
    long long f[31][31][31][31][31];
    int n[6];
    int main(){
    	n[1]=n[2]=n[3]=n[4]=n[5]=30;//每一行容纳数量
    	f[0][0][0][0][0]=1;
    	for(int a=1;a<=n[1];a++){
    		for(int b=0;b<=n[2];b++){
    			if(b>a)break;
    			for(int c=0;c<=n[3];c++){
    				if(c>b)break;
    				for(int d=0;d<=n[4];d++){
    					if(d>c)break;
    					for(int e=0;e<=n[5];e++){
    						if(e>d)break;
    						if(a>b){
    							f[a][b][c][d][e]+=f[a-1][b][c][d][e];
    						}
    						if(b>c){
    							f[a][b][c][d][e]+=f[a][b-1][c][d][e];
    						}
    						if(c>d){
    							f[a][b][c][d][e]+=f[a][b][c-1][d][e];
    						}
    						if(d>e){
    							f[a][b][c][d][e]+=f[a][b][c][d-1][e];
    						}
    						if(e){
    							f[a][b][c][d][e]+=f[a][b][c][d][e-1];
    						}
    					}
    				}
    			}
    		}
    	}
    	int t;
    	while(cin>>t){//行数 
    		if(t==0)break;
    		int data[5];
    		for(int i=0;i<t;i++){
    			scanf("%d",&data[i]);//每行的数量 
    		}
    		switch(t){
    			case 1:
    				printf("%lld
    ",f[data[0]][0][0][0][0]);
    				break;
    			case 2:
    				printf("%lld
    ",f[data[0]][data[1]][0][0][0]);
    				break;
    			case 3:
    				printf("%lld
    ",f[data[0]][data[1]][data[2]][0][0]);
    				break;
    			case 4:
    				printf("%lld
    ",f[data[0]][data[1]][data[2]][data[3]][0]);
    				break;
    			case 5:
    				printf("%lld
    ",f[data[0]][data[1]][data[2]][data[3]][data[4]]);
    				break;
    		}
    	}
    	return 0;
    }
  • 相关阅读:
    RabbitMQ安装与配置
    在Web项目中使用shiro
    solr整合spring
    mycat
    SpringSession管理
    Nginx安装与配置(Nginx服务器和Tomcat服务器是不同的服务器)
    dubbo负载均衡与服务降级以及Zookeeper认证
    小笔记
    SpringMVC路径转发与重定向
    java-同步控制及不可变设置(只读访问)
  • 原文地址:https://www.cnblogs.com/zbsy-wwx/p/11680643.html
Copyright © 2020-2023  润新知