关注
别慌,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 评论
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
01-08 09:52
门头沟学院 Java christina2...:楼主你应该问毕业前什么时候能签三方,签三方就代表着给你预留了这个岗位,毕业后直接正式入职。转正答辩拿到正式offer一般都是会签三方的,图片这个HR好像没有三方的概念。
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 生物制药/化工校招攻略 #
72804次浏览 338人参与
# 拿到offer之后,可以做些什么 #
83978次浏览 437人参与
# MiniMax求职进展汇总 #
997次浏览 23人参与
# 哪些公司在招寒假实习? #
20560次浏览 266人参与
# 你觉得面试是靠实力还是靠运气 #
27045次浏览 295人参与
# 怎么防止在试用期被辞退 #
153652次浏览 959人参与
# TCL求职进展汇总 #
139701次浏览 658人参与
# 牛客十周岁生日快乐 #
203745次浏览 1912人参与
# 卷__卷不过你们,只能卷__了 #
14289次浏览 322人参与
# 硬件/芯片公司工作体验 #
142047次浏览 940人参与
# 26年哪些行业会变好/更差 #
21620次浏览 314人参与
# 秋招遇到的奇葩面试题 #
103099次浏览 422人参与
# 写论文的崩溃时刻 #
7850次浏览 168人参与
# 国企vs私企,你更想去? #
306423次浏览 2496人参与
# 去年的flag与今年的小目标 #
11702次浏览 225人参与
# 关于春招你都做了哪些准备? #
122377次浏览 709人参与
# 腾讯音乐求职进展汇总 #
148416次浏览 1056人参与
# 你不能接受的企业文化有哪些 #
14712次浏览 194人参与
# 入职第一天 #
11929次浏览 251人参与
# 交通银行工作体验 #
23112次浏览 72人参与
# 招聘要求与实际实习内容不符怎么办 #
149492次浏览 889人参与

查看3道真题和解析