关注
别慌,DP先考虑状态再考虑转移就行。
首先考虑下如何表示状态。
显然的我们得表示出那些星星被销毁了那些没有。2^n的表示法自然是最简单的,但是肯定无法按时跑出来。因此我们得考虑简化一下。
由于只有相邻的星星才能合并,所以其实我们的状态只要能表达出哪些星星相邻即可。因此,我选择(i,j)来表示第i个星星和第j个星星之间的星星被消除掉了,以及f(i,j)是消除它们能得到的最大得分。
然后我们需要考虑如何转移,对于(i,j),我们只需要知道最后被消除的a是谁就行。根据f(X,X)的定义,之前被消除可以获得最大分数就是f(i,a)+f(a,j),至于具体怎么个消除顺序我不关心。而消除a的得分是与它相邻的两个星星乘积,即:S[i]*S[j]。故此,我们有:
f(i,j)=for a max( f(i,a)+f(a,j)+S[i]*S[j] )
然后我们将伪代码转成C支持的格式
F[i][j]=for (int a=i+1;a<j;++a) F[i][j]=max(F[i][j],F[i][a]+F[a][j]+S[i]*S[j])
最后只剩下两个星星,而且只能是首尾星星,所以结果即为F[0][n-1]
然后我们需要处理下空间复用以及遍历顺序的问题:
空间方面,由于F[a][j]同时被F[0..a][j]依赖,不是一次性的,不能压成一围
遍历顺序方面,由于F[i,a]、F[a,j]必须在F[i,j]之前计算,所以需要安排一下顺序,例如:For (j=n-1;j>=0;--j) for (i=0;i<j;++i);
最后需要处理下边界值以及初始值。略
查看原帖
1 评论
相关推荐
11-15 08:21
江西理工大学 数据分析师 点赞 评论 收藏
分享
10-24 18:54
南京大学 后端工程师 点赞 评论 收藏
分享
11-24 17:07
西南交通大学 交易师 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 你的秋招白月光和意难平公司 #
17854次浏览 163人参与
# 找实习是选平台还是选业务? #
14721次浏览 180人参与
# 百度秋招 #
57546次浏览 396人参与
# 你想跟着什么样领导? #
11423次浏览 132人参与
# 什么样的背景能拿SSP? #
119512次浏览 418人参与
# 从夯到拉,评价编程语言 #
10174次浏览 81人参与
# 每个月花钱最多的地方是? #
8277次浏览 107人参与
# xxx岗位的一天 #
14620次浏览 129人参与
# 十一月总结 #
20961次浏览 213人参与
# 哪一瞬间让你觉得工作好累 #
14605次浏览 179人参与
# 应届生进小公司有什么影响吗 #
100937次浏览 1073人参与
# 职场上哪些事情令人讨厌 #
27505次浏览 111人参与
# 深信服求职进展汇总 #
237516次浏览 1799人参与
# 巨人网络工作体验 #
68576次浏览 499人参与
# 你面试时吹过最大的牛 #
26543次浏览 144人参与
# AI“智障”时刻 #
8699次浏览 77人参与
# 分享一个让你热爱工作的瞬间 #
48954次浏览 418人参与
# 机械人还在等华为开奖吗? #
281146次浏览 1438人参与
# 一人一个landing小技巧 #
134192次浏览 1479人参与
# 实习的内耗时刻 #
203979次浏览 1497人参与
# 牛客租房专区 #
128146次浏览 1359人参与

