• [POJ2279] Mr.Young's Picture Permutations


    歪解:爆空间的DP

    //Writer:jr HSZ;%%%WJMZBMR
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define LL long long
    #define reg register int
    #define f(i,a,b) for(reg i=a;i<=b;i++)
    using namespace std;
    int n,sum;
    int a[6];
    LL f[31][31][31][31][31];
    int main() {
    	while(~scanf("%d",&n)) {
    		sum=0;
    		if(!n)return 0;
    		memset(f,0,sizeof f);
    		memset(a,0,sizeof a);
    		for(int i=1; i<=n; i++) {
    			scanf("%d",&a[i]);
    			sum+=a[i];
    		}
    		f[0][0][0][0][0]=1;
    		for(int a5=0; a5<=a[5]; a5++) {
    			for(int a4=0; a4<=a[4]; a4++) {
    				for(int a3=0; a3<=a[3]; a3++) {
    					for(int a2=0; a2<=a[2]; a2++) {
    						for(int a1=0; a1<=a[1]; a1++) {
    							if(a1 < a[1])
    								f[a1+1][a2][a3][a4][a5] += f[a1][a2][a3][a4][a5];
    							if((a2 < a1) &&(a2 < a[2]))
    								f[a1][a2+1][a3][a4][a5] += f[a1][a2][a3][a4][a5];
    							if((a3 < a2) && (a3 < a1) && (a3<a[3]))
    								f[a1][a2][a3+1][a4][a5] += f[a1][a2][a3][a4][a5];
    							if((a4 < a3) && (a4 < a2) && (a4 < a1) && (a4<a[4]))
    								f[a1][a2][a3][a4+1][a5] += f[a1][a2][a3][a4][a5];
    							if((a5 < a4) && (a5 < a3) && (a5 < a2) && (a5 < a1) && (a5<a[5]))
    								f[a1][a2][a3][a4][a5+1] += f[a1][a2][a3][a4][a5];
    						}
    					}
    				}
    			}
    		}
    		cout << f[a[1]][a[2]][a[3]][a[4]][a[5]] << endl;
    	}
    
    

    正解:杨氏矩阵+勾长公式
    证明:https://blog.csdn.net/acdreamers/article/details/14549077
    (让我证明?不存在的)

    #include <cstdio>
    #include <cstring>
    long long n,c[10],a[10][55],sum[55*55<<1],cnt;
    long long gcd(unsigned long long a,unsigned long long b) {
    	if(!b) return a;
    	return gcd(b,a%b);
    }
    int main() {
    	while(~scanf("%lld",&n)&&n) {
    		long long cnt=0,x=1,y=1;
    		std::memset(sum,0,sizeof sum);
    		for(int i=1; i<=n; i++) scanf("%lld",&c[i]);
    		for(int i=1; i<=n; i++)
    			for(int j=1; j<=c[i]; j++) {
    				cnt++;
    				for(int k=i+1; k<=n; k++) {
    					if(c[k]>=j) sum[cnt]++;
    					else break;
    				}
    				sum[cnt]+=c[i]-j+1;
    			}
    		long long tp;
    		for(int i=1; i<=cnt; i++) {
    			x*=i;
    			y*=sum[i];
    			tp=gcd(x,y);
    			x/=tp,y/=tp;
    		}
    		printf("%lld
    ",x/y);
    	}
    }
    
    我是咸鱼。转载博客请征得博主同意Orz
  • 相关阅读:
    linux & centos命令
    javascript总结
    SocanCode7之模板编写
    SocanCode连接Oracle的方法
    ashx的使用
    SocanCode代码生成器版本更新记录 [SocanCode7全新发布]
    IIS7.0中使用MVC3,静态页正常,其它404
    不用再纠结反射影响效率了
    ASP.NET MVC 框架处理请求生命周期
    create xmlhttprequest
  • 原文地址:https://www.cnblogs.com/sdfzhsz/p/9278798.html
Copyright © 2020-2023  润新知