您的位置:首页 > 其它

自己备查:如何优化算法--缓存

2011-03-18 11:21 399 查看
题目:
http://projecteuler.net/index.php?section=problems&id=164
projecteuler.net #164

How many 20 digit numbers n (without any leading zero) exist such that no three consecutive digits of n have a sum greater than 9?

使用简单算法,从高位到低位便利每种组合,慢的要死

View Code class Problem164 : IProblem
{
Dictionary<int, C> last = new Dictionary<int, C>();
Dictionary<int, C> current = new Dictionary<int, C>();
public object Run()
{
int l, ll;
for (int i = 0; i < 100; i++)
{
l = i / 10;
ll = i % 10;
if (l + ll < 10)
last.Add(i, new C(l, ll, 1));
}
return Run2(2);
}

public long Run2(int level)
{
int thisLevelBegin = (level == 19 ? 1 : 0);

current = new Dictionary<int, C>();

int l, ll, sum, newNum;
long count;
foreach (KeyValuePair<int, C> p in last)
{
l = p.Value.L;
ll = p.Value.LL;
count = p.Value.count;
sum = p.Value.sum;
for (int i = thisLevelBegin, length = 10 - sum; i < length; i++)
{
newNum = i * 10 + l;
if (!current.ContainsKey(newNum))
{
current.Add(newNum, new C(i, l, count));
}
else
{
current[newNum].count += count;
}
}
}
if (level == 19)
{
count = 0;
foreach (KeyValuePair<int, C> p in current)
{
count += p.Value.count;
}

return count;
}
last = current;
return Run2(level + 1);
}
}

class C
{
public int LL;
public int L;
public int sum;
public long count;
public C(int l, int ll, long c)
{
LL = ll;
L = l;
count = c;
sum = l + ll;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐