Aibohphobia 连接
Aibohphobia SPOJ
我正在尝试 solve this exercise.
我有如下解决方案,但出现 Time Limit Exceeded
错误。我想了解为什么这段代码效率低下,因为我正在做记忆。
namespace Aibohphobia
{
class Test
{
static Dictionary<string, int> memo = new Dictionary<string, int>();
static int Main(string[] args)
{
string num = Console.ReadLine();
int N = int.Parse(num);
string input = string.Empty;
for (int i = 0; i < N; i++)
{
memo = new Dictionary<string, int>();
input = Console.ReadLine();
int count = new Test().insert(input, 0, input.Length - 1);
Console.WriteLine(count);
}
return 0;
}
int insert(string input, int start, int end)
{
int count = 0;
var key = start + "_" + end;
if (start >= end)
return 0;
if (memo.ContainsKey(key))
return memo[key];
if (input[start] == input[end])
{
count += insert(input, start + 1, end - 1);
}
else
{
int countLeft = 1 + insert(input, start + 1, end);
int countRight = 1 + insert(input, start, end - 1);
count += Math.Min(countLeft, countRight);
}
memo.Add(key, count);
return count;
}
}
}
您正在 记忆 您的结果在 Dictionary<string, int>
中,本质上是一个散列 table。这意味着每次要检索给定键的值时,都必须计算该键的哈希函数。
在这种情况下,由于您的密钥类型是 string
,哈希函数的计算肯定会减慢您的执行速度。我建议您 memoize 您在 int[][] matrix
中的 DP 值,因此您可以更快地检索您想要的值。
为了实现这一点,您将了解如何将 strings
映射到 ints
。您可以在此处找到有关如何执行此操作的简短教程:String Hashing for competitive programming,作者在其中解释了简单的 字符串哈希 技术。
我正在尝试 solve this exercise.
我有如下解决方案,但出现 Time Limit Exceeded
错误。我想了解为什么这段代码效率低下,因为我正在做记忆。
namespace Aibohphobia
{
class Test
{
static Dictionary<string, int> memo = new Dictionary<string, int>();
static int Main(string[] args)
{
string num = Console.ReadLine();
int N = int.Parse(num);
string input = string.Empty;
for (int i = 0; i < N; i++)
{
memo = new Dictionary<string, int>();
input = Console.ReadLine();
int count = new Test().insert(input, 0, input.Length - 1);
Console.WriteLine(count);
}
return 0;
}
int insert(string input, int start, int end)
{
int count = 0;
var key = start + "_" + end;
if (start >= end)
return 0;
if (memo.ContainsKey(key))
return memo[key];
if (input[start] == input[end])
{
count += insert(input, start + 1, end - 1);
}
else
{
int countLeft = 1 + insert(input, start + 1, end);
int countRight = 1 + insert(input, start, end - 1);
count += Math.Min(countLeft, countRight);
}
memo.Add(key, count);
return count;
}
}
}
您正在 记忆 您的结果在 Dictionary<string, int>
中,本质上是一个散列 table。这意味着每次要检索给定键的值时,都必须计算该键的哈希函数。
在这种情况下,由于您的密钥类型是 string
,哈希函数的计算肯定会减慢您的执行速度。我建议您 memoize 您在 int[][] matrix
中的 DP 值,因此您可以更快地检索您想要的值。
为了实现这一点,您将了解如何将 strings
映射到 ints
。您可以在此处找到有关如何执行此操作的简短教程:String Hashing for competitive programming,作者在其中解释了简单的 字符串哈希 技术。