我正在开发一款游戏,我需要找到特定句子的最大重量。
假设我有一个句子“快速的棕色狐狸”,并假设单词和双词都有定义的重量:“the” - > 10,“快速” - > 5,“棕色” - > 3,“狐狸” - > 8,“快速” - > 5,“快速褐色” - > 10,“棕色狐狸” - > 1
我想知道单词和双词的哪个组合提供最大的权重,在这种情况下它将是“the”,“quick brown”,“fox”(权重= 28)
我被告知这个问题可以通过线性编程解决,但我没有看到如何实现这样的方法。具体来说,我不知道如何表达问题的约束,在这种情况下,一些双字不能与包含的单个单词组合的事实(即“快速”不能与任何一个组合“the”或“quick”)
是的,有人可以就如何解决这个问题提供一些指导?我不是该领域的专家,对Simplex如何工作(从学校回来)有一些基本的了解,但我缺乏如何模拟这类问题的知识。此外,任何其他方法(不涉及线性编程或蛮力)也会受到欢迎。
感谢。
答案 0 :(得分:0)
假设组合仅由单个和双字组成:
int single[n];//if we choose i-th word : single[i]
int doubles[n];//if we choose the i-th and i+1-th word as a combination : doubles[i], the last word has the same value for it's single and doubles
int dp[n+2];//dynamic programming
dp[n] = dp[n+1] = 0;//bottom up
for(int i=n-1;i>=0;i--)
{
dp[i]=max(dp[i+1]+single[i],dp[i+2],double[i];
}
//the maximum value is dp[0]
答案 1 :(得分:0)
针对您的示例问题的强力方法涉及2^7
可能的组合 - 让我们看看我们是否可以减少它。为方便起见,让我们映射变量:
the quick brown fox -> (a1, a2, a3, a4)
the quick -> b1
quick brown -> b2
brown fox -> b3
a3=True
表示我们使用的是“棕色”。由此,我们可以构建一组规则。例如,b3
不能与a3
或a4
一起使用:
(a1:b1) (b1:a1,a2)
(a2:b1,b2) (b2:a2,a3)
(a3:b2,b3) (b3:a3,a4)
(a4:b3)
现在从数组S=[a1=0,a2=0,...,b3=0]
开始递归地逐步执行变量组合,如果违反了我们的某个规则,请尽早修剪分支。如果我们到达叶节点,输出对应于变量的权重,并保留它,如果到目前为止是最大的。这可能不是最有效的答案,但它肯定可以削减组合。
答案 2 :(得分:0)
使用位置BiggestWeight(i)
至i
的字词来调用n-1
子问题,其中n
是字数。
您的问题是找到BiggestWeight(0)
。
基本案例为BiggestWeight(n)
,等于0
,因为单词列表为空,
和BiggestWeight(n-1)
,等于weight(n-1)
,因为一个单词的列表只有一个选项。
子问题之间的关系是:
BiggestWeight(i) = max(weight(i)+BiggestWeight(i+1), pairWeight(i,i+1)+BiggestWeight(i+2) )
因为i
个单词要么是单个单词,要么是双字中的第一个单词。
因此,如果值存储在大小为n+1
的表中,则可以在O(n)
中找到结果。
答案 3 :(得分:0)
您可以非常有效地使用DP。
设F为最大权重函数,并使句子为w1 w2 w3 ... wk
设G([w1 w2 ..])返回组合的字典权重。
F([w1 w2 w3 ... wk])= Max(G([w1])+ F([w2 w3 ... wk]),G([w1,w2])+ F([w3] w4 ... wk])...)