关注
别慌,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 评论
相关推荐
牛客热帖
更多
正在热议
更多
# 这个offer值得去吗? #
23064次浏览 187人参与
# 上班苦还是上学苦呢? #
345687次浏览 2073人参与
# 联宝杯大学生创新大赛,你的技术值得产业级答案 #
48167次浏览 521人参与
# 如果春招能重来,我会___ #
23325次浏览 246人参与
# 实习怎么做才有更好的产出 #
50187次浏览 458人参与
# 你会因为行情,降低找工作标准吗? #
36201次浏览 296人参与
# 在爱玛,骑向未来 #
14728次浏览 333人参与
# 字节开奖 #
153191次浏览 711人参与
# 我的秋招“寄”录 #
476636次浏览 3064人参与
# 面试线索爆料 #
131122次浏览 706人参与
# 提名点击就挂的公司 #
144363次浏览 492人参与
# 刚入职就____,这样正常吗? #
143668次浏览 691人参与
# AI coding的好用工具分享 #
88661次浏览 567人参与
# 字节求职进展汇总 #
1851075次浏览 15434人参与
# 找工作以来,你最看不惯__ #
79544次浏览 594人参与
# 大学四年该怎么过,才不算浪费时间? #
23982次浏览 107人参与
# 硬件人秋招的第一个offer #
129166次浏览 1473人参与
# AI“智障”时刻 #
40505次浏览 195人参与
# 业务面应该做哪些准备 #
128215次浏览 1345人参与
# 双非本科求职如何逆袭 #
1651440次浏览 13097人参与
# 双非应该如何逆袭? #
588765次浏览 6409人参与
# 制造业的秋招小结 #
157459次浏览 2136人参与
