关注
别慌,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 评论
牛客热帖
更多
正在热议
更多
# 笔试 #
2336720次浏览 27272人参与
# 谈薪时HR压价该怎么应对 #
187850次浏览 2993人参与
# 牛友故事会 #
494971次浏览 11445人参与
# 小米提前批笔试难吗 #
30408次浏览 335人参与
# 机械只有转码才有出路吗? #
122650次浏览 1584人参与
# 腾讯云智研发工作体验 #
17731次浏览 129人参与
# 高学历就一定能找到好工作吗? #
44007次浏览 568人参与
# 硬件打工人的必备素养 #
12973次浏览 80人参与
# 找工作有哪些冷知识 #
10367次浏览 143人参与
# 如果再来一次,你还会学硬件吗 #
117324次浏览 1383人参与
# 你觉得材料专业有必要实习嘛 #
10847次浏览 55人参与
# 机械人值得去的车企 #
13357次浏览 109人参与
# 通信/硬件公司求职体验 #
101268次浏览 793人参与
# 国企和大厂硬件兄弟怎么选? #
117188次浏览 1648人参与
# 实习期间如何提升留用概率? #
24649次浏览 341人参与
# 机械人,你最希望上岸的公司是? #
157957次浏览 1854人参与
# 非技术er求职现状 #
49920次浏览 364人参与
# 你的秋招第一面感觉怎么样 #
63756次浏览 528人参与
# 生物制药/化工校招攻略 #
38175次浏览 270人参与
# 通信/硬件求职避坑tips #
48459次浏览 478人参与