关注
别慌,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-23 03:19
University of Miami Java 点赞 评论 收藏
分享
牛客热帖
正在热议
# 25届秋招总结 #
349337次浏览 3399人参与
# 我的实习求职记录 #
6083135次浏览 83660人参与
# 阿里云管培生offer #
41372次浏览 959人参与
# 地方国企笔面经互助 #
5107次浏览 13人参与
# 职场吐槽大会 #
90389次浏览 747人参与
# 选完offer后,你后悔学本专业吗 #
22873次浏览 164人参与
# 北方华创开奖 #
49408次浏览 447人参与
# ai智能作图 #
2624次浏览 60人参与
# 运营商笔面经互助 #
92475次浏览 1332人参与
# 实习中的菜狗时刻 #
278677次浏览 2739人参与
# 如果有时光机,你最想去到哪个年纪? #
24353次浏览 499人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
37101次浏览 341人参与
# 风评不好的公司,你会去吗? #
20677次浏览 94人参与
# 大疆求职进展汇总 #
413251次浏览 2933人参与
# 国企还是互联网,你怎么选? #
90064次浏览 699人参与
# 软件开发2024笔面经 #
2325284次浏览 48214人参与
# 如何一边实习一边秋招 #
999646次浏览 12697人参与
# 远程面试的尴尬瞬间 #
20389次浏览 294人参与
# 数据人offer决赛圈怎么选 #
118203次浏览 1475人参与
# 银行笔面经互助 #
84661次浏览 895人参与
# 腾讯求职进展汇总 #
198731次浏览 1653人参与
# bilibili求职进展汇总 #
33920次浏览 361人参与