Мне дан ввод «N», мне нужно найти номер списка длины N, который начинается с 1, так что следующее добавленное число не более 1 больше, чем максимальное число добавлено до настоящего времени. Например,Оптимальный алгоритм
N = 3, возможные списки => (111, 112, 121, 122, 123), [113 или 131 невозможно, так как при добавлении «3» в список максимальное число, присутствующее в списке список будет «1», поэтому мы можем добавить только 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: Я хочу знать только количество таких списков, поэтому я уверен, что создание всего списка не потребуется. (Как я это делаю в коде) Я не совсем хорош в алгоритмах, поэтому, пожалуйста, извините за длинный вопрос.
Это домашнее задание? Является ли текст, который вы опубликовали, точно вопрос? Я спрашиваю, потому что я не правильно понимаю вопрос, и если это домашняя работа, вы можете задать точный вопрос. – gbulmer
Нет, это не домашнее задание, это просто головоломка, которую меня попросил друг. Если у вас есть какие-то сомнения по поводу вопроса, пожалуйста, спросите, может быть, я могу уточнить. – user1045047
Хорошо - это 111 список из трех значений, или это всего лишь одно число? – gbulmer