博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA - 10559 Blocks
阅读量:6574 次
发布时间:2019-06-24

本文共 1060 字,大约阅读时间需要 3 分钟。

题文:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1500(或者见紫书)

 

题解:

  因为这个题目我们用区间的dp常见套路设dp[i][j]表示处理到i~j的最大贡献不能靠枚举断点进行转移,所以我们要更细致的描述这个状态。设dp[i][j][k],表示把第i个区间和第j个区间合并,并且由于前面的消除有k个与区间j的颜色相同的方块接着j后面的最大贡献。

  那么转移我们可以考虑1.直接将j区间和k消除。dp[i][j][k]=dp[i][j-1][0]+(len[j]+k)^2。2.考虑将j和前面的某个颜色相同的区间合并,所以要消除中间的某几段区间。

既:dp[l][r][k]=dp[i+1,][r-1][0]+dp[l][i][k+len[r]]。的确这个题目还是自己好好消化吧,是道经典的dp题目。

 

代码:

#include
#include
#include
#include
#include
using namespace std;int color[1000],len[1000],n,t;int shu[1000],dp[300][300][300];void cl(){ memset(color,0,sizeof(color)); memset(len,0,sizeof(len)); memset(shu,0,sizeof(shu)); memset(dp,0,sizeof(dp));}int dfs(int l,int r,int k){ if(l>r) return 0; if(l==r) return (len[l]+k)*(len[l]+k); if(dp[l][r][k]!=0) return dp[l][r][k]; dp[l][r][k]=dfs(l,r-1,0)+(len[r]+k)*(len[r]+k); for(int i=l;i

 

转载于:https://www.cnblogs.com/renjianshige/p/7392715.html

你可能感兴趣的文章
[ZJOI2015]诸神眷顾的幻想乡
查看>>
2018-2019-2 网络对抗技术 20165318 Exp1 PC平台逆向破解
查看>>
关于图片或者文件在数据库的存储方式归纳
查看>>
存储过程和SQL语句比较及存储过程在C#中调用方法
查看>>
hihocoder 1014 Trie树
查看>>
ADO.NET笔记——使用DataSet返回数据
查看>>
【机器学习】--关联规则算法从初识到应用
查看>>
windows 下nginx php安装
查看>>
MOTO XT702添加开机音乐
查看>>
Codeforces Round #565 (Div. 3) C. Lose it!
查看>>
Python脚本日志系统
查看>>
Spring异常——BeanNotOfRequiredTypeException
查看>>
B0BO TFS 安装指南(转载)
查看>>
gulp常用命令
查看>>
TCP(Socket基础编程)
查看>>
RowSet的使用
查看>>
表单提交中的input、button、submit的区别
查看>>
每日一记--cookie
查看>>
约瑟夫环
查看>>
S5:桥接模式 Bridge
查看>>