poj 1390 Blocks 区间DP

Description:

给你一堆方块,颜色相同可以消去,每次消去的价值为消去方块的个数的平方。单个方块可以消去。问你最后收获的最大价值为多少

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 using namespace std;
 5 const int N = 220;
 6 int dp[N][N][N], g[N][N], col[N];
 7 //dp[i][j][k]表示i-j这一段消得只剩k个且k个块都相同时收获的最大价值,g[i][j]表示i-j能收获的最大价值
 8 int n, m;
 9 int main(){
10     int T, kase = 0;
11     scanf("%d", &T);
12     while(T--){
13         scanf("%d", &n);
14         for(int i = 1; i <= n; i++) scanf("%d", &col[i]);
15         memset(dp, -63, sizeof(dp)); //达不到的状态为负无穷大
16         memset(g, 0, sizeof(g));
17         for(int i = 1; i <= n; i++)
18           dp[i][i][1] = 0, dp[i][i][0] = 0, g[i][i] = 1;
19         for(int l = 2; l <= n; l++)
20           for(int i = 1, j; i + l - 1 <= n; i++){   //枚举区间
21               j = i + l - 1;
22               if(col[i] == col[j]){  //如果区间首尾相同 说明可能通过消去区间内的方块更新dp数组
23                   for(int k = 1; k <= l; k++){  //枚举可能的相同剩余方块数
24                       for(int t = i; t < j; t++)  //枚举区间的每个方块
25                         if(col[i] == col[t])   //如果发现有方块与区间首方块相同
26                             //那么i到t的方块可以消掉t+1-j的方块后 达到dp[i][t][k-1]的状态
27                             //把两边的两边产生的价值累加之后更新dp数组
28                           dp[i][j][k] = max(dp[i][j][k], dp[i][t][k - 1] + g[t + 1][j - 1]);
29                       //那么区间g[i][j]的价值可以表现为状态dp[i][j][k]的价值和消掉剩下的k个方块的价值
30                       g[i][j] = max(g[i][j], dp[i][j][k] + k * k);
31                   }
32               }
33               for(int k = i; k < j; k++)  //重新刷一波更新g数组
34                 g[i][j] = max(g[i][j], g[i][k] + g[k + 1][j]);
35           }
36         printf("Case %d: %d\n", ++kase, g[1][n]);
37     }
38     return 0;
39 }

原文地址:https://www.cnblogs.com/Rorshach/p/9275825.html

时间: 2024-10-09 08:07:28

poj 1390 Blocks 区间DP的相关文章

POJ 1390 Blocks(DP + 思维)题解

题意:有一排颜色的球,每次选择一个球消去,那么这个球所在的同颜色的整段都消去(和消消乐同理),若消去k个,那么得分k*k,问你消完所有球最大得分 思路:显然这里我们直接用二位数组设区间DP行不通,我们不能表示出“合并”这种情况.我们先把所有小块整理成连续的大块. 我们用click(l,r,len)表示消去l到r的所有大块和r后len块和r颜色一样的小块的最大得分.那么这样我们可以知道,click(l,r,len)只有两种情况: 1.r直接和后面len全都消去 2.r带着len先和前面的一样的颜色

[POJ 1390]Blocks

Description Some of you may have played a game called 'Blocks'. There are n blocks in a row, each box has a color. Here is an example: Gold, Silver, Silver, Silver, Silver, Bronze, Bronze, Bronze, Gold. The corresponding picture will be as shown belo

POJ 1390 Blocks(记忆化搜索+动态规划)

POJ 1390 Blocks 砌块 时限:5000 MS   内存限制:65536K 提交材料共计: 6204   接受: 2563 描述 你们中的一些人可能玩过一个叫做"积木"的游戏.一行有n个块,每个盒子都有一个颜色.这是一个例子:金,银,铜,金.相应的图片如下: 图1如果一些相邻的盒子都是相同的颜色,并且它左边的盒子(如果它存在)和它的右边的盒子(如果它存在)都是其他颜色的,我们称它为"盒子段".有四个盒子段.那就是:金,银,铜,金.片段中分别有1,4,3,

POJ 1179 Polygon 区间DP

链接:http://poj.org/problem?id=1179 题意:给出一个多边形,多边形的每个顶点是一个数字,每条边是一个运算符号"+"或者"x".要求的过程如下,手下移除一条边,即这条边不做运算.之后每次移除一条边,将其两边的数字进行对应边的运算,用得到的数字来替代原来的两个点.要求所有边都移除以后得到的最大的答案. 思路:典型的区间DP,在过程中每次操作的处理方式为dp_max[i][j]=dp[i][k]*dp[k+1][j],dp_max[i][j]

【POJ-1390】Blocks 区间DP

Blocks Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5252   Accepted: 2165 Description Some of you may have played a game called 'Blocks'. There are n blocks in a row, each box has a color. Here is an example: Gold, Silver, Silver, Sil

POJ 2955 Brackets (区间DP)

题意:给定一个序列,问你最多有多少个合法的括号. 析:区间DP,dp[i][j] 表示在 第 i 到 第 j 区间内最多有多少个合法的括号. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <ios

POJ 1160 (区间DP+四边形优化)

这个转移方程不好想,尤其是一段值的解是中间,不明觉厉.dp[i][j] 用i个邮局,覆盖前j个村庄的最小值. 还有就是区间dp的平行四边形优化,这个题的转移方程并不是"区间DP",所以枚举状态要逆着(很花时间),且用一个邮局覆盖都是从0断开了相当于没有断开. 类比于石子归并,矩阵链乘等标准区间DP,其所需状态之前就已经获得,不用倒推 #include <cstdio> #include <cstring> #include <iostream> us

POJ 2955-Brackets(区间DP)

Brackets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3340   Accepted: 1716 Description We give the following inductive definition of a "regular brackets" sequence: the empty sequence is a regular brackets sequence, if s is a reg

POJ 1159 Palindrome(区间DP/最长公共子序列+滚动数组)

Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 56150   Accepted: 19398 Description A palindrome is a symmetrical string, that is, a string read identically from left to right as well as from right to left. You are to write a