zoukankan      html  css  js  c++  java
  • UVA10559 Blocks

    玄学东西,毒瘤状态,死也想不出

    设f[l][r][i]表示[l,r]区间,右边再加上i个颜色和r颜色相同的块,消掉这些的最大收益

    两种转移方式:

    • 把r和后面i个一起销毁,(f[l][r-1][0]+(i+1)^2)
    • 选择一个位置p使得p,r位置上的颜色相同,消掉p,r中间这段,再把r和后面i个接上去转移。(f[l][p][i+1]+f[p+1][r-1])

    我™怎么知道为什么

    #include<bits/stdc++.h>
    #define il inline
    #define vd void
    typedef long long ll;
    il int gi(){
    	int x=0,f=1;
    	char ch=getchar();
    	while(ch<'0'||ch>'9'){
    		if(ch=='-')f=-1;
    		ch=getchar();
    	}
    	while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    	return x*f;
    }
    int f[201][201][201];
    int a[201];
    int main(){
    	int T=gi();
    	for(int yyb=1;yyb<=T;++yyb){
    		int n=gi();
    		for(int i=1;i<=n;++i)a[i]=gi();
    		for(int i=1;i<=n;++i)
    			for(int j=0;j<=n;++j)
    				f[i][i][j]=(j+1)*(j+1);
    		for(int s=2;s<=n;++s)
    			for(int l=n-s+1;l;--l){
    				int r=l+s-1;
    				for(int i=0;i<=n;++i){
    					f[l][r][i]=f[l][r-1][0]+(i+1)*(i+1);
    					for(int p=l;p<r;++p)if(a[p]==a[r])f[l][r][i]=std::max(f[l][r][i],f[l][p][i+1]+f[p+1][r-1][0]);
    				}
    			}
    		printf("Case %d: %d
    ",yyb,f[1][n][0]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    送股分红是怎么回事?
    基金申购费用计算
    msn 爬楼梯
    沪市证券交易费用
    OS X
    见到郎咸平:)
    Long long time_Blog更新了
    生~气:)
    突然想起去年的今天
    久久沉思以后
  • 原文地址:https://www.cnblogs.com/xzz_233/p/9668352.html
Copyright © 2011-2022 走看看