hiho一下第281周《最美和弦》题目分析

7
0

本题是一道DP题,需要一点优化。

比较容易想到状态表示:

f[i][j][k] 表示前i个和弦,其中换了j次和弦,最后第i个和弦是k,最小不和谐值是多少。

注意这里我们认为同一个音的大三和弦与小三和弦是不同的和弦。所以k的取值一共右401 * 2种

i的取值范围是N(<=1000), i的取值范围是K(<=20)。总状态数大概1600万。

转移比较容易想到的是,考虑是从i-1个和弦是否经过变换和弦得到的:
(1)如果不变换和弦,则是 f[i][j][k] = f[i-1][j][k] + w(i, k) w(i, k)表示第i个和弦弹第k种和弦的不和谐值
(2)否则,要枚举前一个和弦是哪种,f[i][j][k] = min{f[i-1][j-1][p] + w(i, k) | p != k}

显然(2)的转移复杂度太高了,实际上,考虑到w(i, k)同p没关系,不管前一个和弦是哪种,转换的w都是相同的,所以我们可以预先求出best[i][j] = min{ f[i][j][p] | p = 所有和弦 },这样对于(2)就可以O(1)转移: f[i][j][k] = best[i-1][j-1] + w(i, k)

综合(1)(2)即 f[i][j][k] = min{f[i-1][j-1][k], best[i-1][j-1]} + w(i, k)

可能有人会有疑问,之前(2)中的p的范围是p!=k,到了best的计算中p的范围是p=所有和弦。这样用best转移岂不是把p==k也按需要变换和弦计算进去了?

确实是这样,不过并不会影响最后的答案。因为如果最后我们会取f[N][*][*]的最小值作为答案。如果某个f[i-1][j-1][k]导致f[i][j][k]"错误"变小了,那么意味着f[i][j-1][k]比f[i][j][k]更小,f[i][j][k]的"错误"不影响大局。

0 answer(s)

write answer 切换为英文 切换为中文


转发分享