Ссылка вопроса: http://codeforces.com/contest/2/problem/BКак решить эту проблему с помощью DP?
Существует квадратная матрица n × n, состоящая из неотрицательных целых чисел. Вы должны найти на нем такой способ, чтобы
начинается в верхней левой ячейке матрицы; каждая следующая ячейка находится справа или вниз от текущей ячейки; путь заканчивается в нижней правой ячейке. Кроме того, если мы умножим все числа по пути, результат должен быть наименьшим «круглым». Другими словами, он должен заканчиваться наименьшим количеством нулей.
Ввод Первая строка содержит целое число n (2 ≤ n ≤ 1000), n - размер матрицы. Затем следуют n строк, содержащих матричные элементы (неотрицательные целые числа, не превышающие 10^9).
Выход В первой строке напечатайте наименьшее количество конечных нулей. Во второй строке напечатайте соответствующий способ.
Я подумал о следующем: в конце концов, каким бы ни был ответ, он должен содержать минимальные полномочия 2 и 5. Поэтому, что я сделал, для каждой записи во входной матрице я вычислил мощности 2 и 5 и сохранил их в отдельных матрицах.
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
cin>>foo;
matrix[i][j] = foo;
int n1 = calctwo(foo); // calculates the number of 2's in factorisation of that number
int n2 = calcfive(foo); // calculates number of 5's
two[i][j] = n1;
five[i][j] = n2;
}
}
После этого я сделал это:
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
dp[i][j] = min(two[i][j],five[i][j]); // Here, dp[i][j] will store minimum number of 2's and 5's.
}
}
Но выше на самом деле не является действительным ответом, я не знаю, почему? Я применил правильный подход? Или это правильный способ решения этого вопроса?
Редактировать: Вот мои функции вычисления числа двух и пяти чисел в числе.
int calctwo (int foo)
{
int counter = 0;
while (foo%2 == 0)
{
if (foo%2 == 0)
{
counter++;
foo = foo/2;
}
else
break;
}
return counter;
}
int calcfive (int foo)
{
int counter = 0;
while (foo%5 == 0)
{
if (foo%5 == 0)
{
counter++;
foo = foo/5;
}
else
break;
}
return counter;
}
Edit2: I/O Пример, как указано в ссылке:
Входной сигнал:
3
1 2 3
4 5 6
7 8 9
Выход:
0
DDRR
Для этого вам понадобится _lot_ больше работы, чем несколько строк кода C. Я бы использовал рекурсивный подход. –
не нужно, @ TimBiegeleisen, простой код будет работать с использованием dp. – vish4071
@ vish4071, как я могу его улучшить? – rohansingh