我得到一个输入“N”,我必须找到长度为 N 的列表的数量,它以 1 开头,这样要添加的下一个数字最多比迄今为止添加的最大数量多 1。例如,
N = 3, possible lists => (111, 112, 121, 122, 123), [113, or 131 是不可能的,因此我们只能添加 1 或 2]。
N = 4,列表1213是可能的,同时添加3,列表中的最大数量是'2',因此可以添加3。
问题是计算给定输入“N”可能的此类列表的数量。
我的代码是:-
public static void Main(string[] args)
{
var noOfTestCases = Convert.ToInt32(Console.ReadLine());
var listOfOutput = new List<long>();
for (int i = 0; i < noOfTestCases; i++)
{
var requiredSize = Convert.ToInt64(Console.ReadLine());
long result;
const long listCount = 1;
const long listMaxTillNow = 1;
if (requiredSize < 3)
result = requiredSize;
else
{
SeqCount.Add(requiredSize, 0);
AddElementToList(requiredSize, listCount, listMaxTillNow);
result = SeqCount[requiredSize];
}
listOfOutput.Add(result);
}
foreach (var i in listOfOutput)
{
Console.WriteLine(i);
}
}
private static Dictionary<long, long> SeqCount = new Dictionary<long, long>();
private static void AddElementToList(long requiredSize, long listCount, long listMaxTillNow)
{
if (listCount == requiredSize)
{
SeqCount[requiredSize] = SeqCount[requiredSize] + 1;
return;
}
var listMaxTillNowNew = listMaxTillNow + 1;
for(var i = listMaxTillNowNew; i > 0; i--)
{
AddElementToList(requiredSize, listCount + 1,
i == listMaxTillNowNew ? listMaxTillNowNew : listMaxTillNow);
}
return;
}
这是蛮力方法。我想知道解决这个问题的最佳算法是什么?PS:我只想知道此类列表的数量,因此我确信不需要创建所有列表。(我在代码中的做法)我在算法方面一点也不擅长,所以请原谅这个冗长的问题。