@Pigmon
2016-04-29T14:14:06.000000Z
字数 3442
阅读 982
Python
采用自底向上的动态规划法。
Algorithm Domino(s[]):
n <- Length(s);
Ends0 <- 0;
Ends1 <- 0;
Stat0 <- '0'; #Ends0的组合序列字符串
Stat1 <- '1'; #Ends1的组合序列字符串
for (i in 0..n-2):
f00 <- s[i]与s[i+1]在组合00的情况下的R[i]*L[i+1];
f01 <- s[i]与s[i+1]在组合01的情况下的R[i]*L[i+1];
f10 <- s[i]与s[i+1]在组合10的情况下的R[i]*L[i+1];
f11 <- s[i]与s[i+1]在组合11的情况下的R[i]*L[i+1];
Sum00 <- Ends0 + f00;
Stat00 <- Stat0 连接 '0';
Sum01 <- Ends0 + f01;
Stat01 <- Stat0 连接 '1';
Sum10 <- Ends1 + f10;
Stat10 <- Stat1 连接 '0';
Sum11 <- Ends1 + f11;
Stat11 <- Stat1 连接 '1';
Ends0 <- Max(Sum00, Sum10); 记录 Stat0;
Ends1 <- Max(Sum01, Sum11); 记录 Stat1;
end
return Max(Ends0, Ends1);
对于所有 骨牌,每次循环需要计算:
- 与的00, 01, 10, 11四种组合的 的值。
- 将00, 01两个组合计算的结果与 Ends0 相加得(Sum00, Sum01);
- 将10, 11两个组合计算的结果与 Ends1 相加得(Sum10, Sum11);
- 将 Max(Sum00, Sum10)记录到 Ends0;
- 将 Max(Sum01, Sum11)记录到 Ends1;
以上计算的时间复杂度为常数级O(C)。
循环一共执行 n-1 次。
,即时间复杂度为,复合题目要求。
以题目中的骨牌序列为例。
计算 s1,s2 两张骨牌在00, 01, 10, 11四种组合下的
在以0结尾的组合中,f00较大,遂舍弃f10,Ends0=f00=16
在以1结尾的组合中,f01较大,遂舍弃f11,Ends1=f01=32
Ends0序列为00
Ends1序列为01
计算 s2,s3 两张骨牌在00, 01, 10, 11四种组合下的
Ends0序列为010
Ends1序列为001
计算 s3,s4 两张骨牌在00, 01, 10, 11四种组合下的
Ends0序列为0100
Ends1序列为0101
计算 s4,s5 两张骨牌在00, 01, 10, 11四种组合下的
Ends0序列为01000 (选第1个)
Ends1序列为01011 (选第1个)
计算 s5,s6 两张骨牌在00, 01, 10, 11四种组合下的