• UVA10559 Blocks(区间dp)


    有n个带有颜色的方块,没消除一段长度为x的连续的相同颜色的方块可以得到x^2的分数,让你用一种最优的顺序消除所有方块使得得分最多。

    输入格式 第一行包含测试的次数t(1≤t≤15) 每个案例包含两行。第一行包含整数n(1≤n≤200),即框数。第二行包含n个数,代表每个盒子的颜色。数字的大小1~n内。

    Solution

    n比较小,所以我们要用n^3的dp。

    我们设dp[i][j][k]表示从i缩到j,j要和j后面的k个格子缩到一起能获得的最大分数。

    转移的话枚举断点,如果有一个点和j相等,就把k向前传递,否侧向后传递。

    Code

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int x,dp[309][309][309],a[309],b[309],n,tot,t,p; 
    int dfs(int i,int j,int s){   
        if(dp[i][j][s])return dp[i][j][s];
        if(i>j)return 0;
        if(i==j)return dp[i][j][s]=(b[j]+s)*(b[j]+s);
        for(int k=i;k<j;++k)
          if(a[k]==a[j])
            dp[i][j][s]=max(dp[i][j][s],dfs(i,k,s+b[j])+dfs(k+1,j-1,0));
          else dp[i][j][s]=max(dp[i][j][s],dfs(i,k,0)+dfs(k+1,j,s));
        return dp[i][j][s];
    }
    int main(){
        cin>>t;
        while(t--){
        p++;
        cin>>n;a[0]=-99;tot=0;
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;++i){
          scanf("%d",&x); 
          if(x==a[tot])b[tot]++;
          else a[++tot]=x,b[tot]=1;
        }
        cout<<"Case "<<p<<": "<<dfs(1,tot,0)<<endl;
        }
        return 0;
    }
  • 相关阅读:
    大数据学习之路又之从小白到用sqoop导出数据
    大数据学习之路又之从csv文件到sql文件的操作过程
    大三第一次极限测试总结
    学习套模板
    今天
    大数据学习之路之ambari配置(四)
    大数据学习之路之ambari配置(三)
    数据清洗——地域维度
    Hive数据分析(五)
    Hive数据分析(四)
  • 原文地址:https://www.cnblogs.com/ZH-comld/p/9841568.html
Copyright © 2020-2023  润新知