poj1390 方块消除 dp

博客介绍了如何使用动态规划解决POJ1390方块消除问题,通过将方块序列按颜色分段,然后考虑不同情况下的消去策略,如直接消去某区域或与前一相同颜色区域合并。文章提供了存在问题但能AC的代码1和正确无误的代码2。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:徐源盛《对一类动态规划问题的研究》以及刘汝佳的黑书《算法艺术与信息学竞赛》

将方块序列,按颜色分成一段一段的,例如 1 1 1 1 1 3 2 2 1 1 1 可记为color[ 1 ] = 1; len[1 ] = 5; color[ 2 ] = 3; len[ 2 ] =1; color[ 3 ] = 2; len[ 3 ] = 2; color[ 4 ] = 1; len[ 4 ] = 3;   

(1) 如果直接消去第j个区域和未来会接到j后面的k块,那么f[i][j][k]=f[i][j-1][0]+(bj+k)*(bj+k)。
(2) 如果j与之前一起合并,假设与j颜色相同的是区域p,那么
f[i][j][k]=f[i][p][k+bj]+f[p+1][j-1][0](i<=p<j且color[ p ]==color[ j ])
f[i][j][k]为两者的最大值。 (注意:k为假设未来会有k个连在j的后面,并将这样的情况的值存储起来,如果未来真的发生这种情况,将这个值直接调用)
答案即是f[1][n][0]。

代码1:此代码感觉是有问题的,问题在注释中,但是可以AC

#include <iostream>
using namespace std;

#define MAX(a, b) a>b?a:b
#define N 202

int color[N], len[N], after[N];
int dp[N][N][N];

int main()
{
	int cas, m, n;
    int i, j, l, r, k, p, id;
    int seq[N], cnt;
	bool vis[N];
	
	cas = 1;
	scanf("%d", &m);
	while(m--)
	{
		scanf("%d", &n);
		scanf("%d", &seq[1]);
		id = cnt = 1;
        for(i = 2; i <
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值