Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2019, 10:18   #1
Константин01
Пользователь
 
Регистрация: 11.05.2019
Сообщений: 21
По умолчанию Задача динамического программирования (acmp 169)

Здравствуйте!

Прошу помощи в решение задачи. Условие:


Цитата:
На расстоянии N шагов от магазина стоит человек. Каждую минуту он выбирает, куда сделать шаг: к магазину или в противоположном направлении.

Требуется написать программу, которая определит, сколькими способами он может попасть в магазин, пройдя ровно K шагов и оказавшись в магазине только после выполнения последнего шага.

Входные данные
Входной файл INPUT.TXT содержит 2 числа n и k, записанные через пробел. Известно, что 1 ≤ N ≤ K ≤ 37.

Выходные данные
Выходной файл OUTPUT.TXT должен содержать одно число – количество способов попадания в магазин.

Пример:

INPUT:
n = 2
k = 4

OUTPUT:

2

Моя попытка: я предположил, что здесь можно использовать числа Каталана. Но как окончательно оформить задачу - не знаю. Код работает для случая n=k, но в других случаях превышает результат на единицу.


Код:
#include <iostream>

using namespace std;


int catalan(int n, int k)
{
	int sum = 0;;

	if (n == k) // если число доступных шагов совпадает с числом шагов до магазина
	{
		sum = sum + 1;
		return sum;
	}

	if (k <= 1) // базовый случай для чисел Каталана
	{
		sum = sum+1;
		return sum;
	}

	if (abs(n-k) == 1 || n > k) 
	{
		sum = sum + 0;
		return sum;
	}
	else
	{
		for (int i=0; i<k; i++)
		{
			sum = sum + catalan(n, i) * catalan(n, n-i-1);
			
		}
		return sum;
	}
}

int main()
{
	int n = 2;
	int k = 4;

	int result = 0;

	result = catalan(n, k);

	cout << result;

	return 0;
}
Константин01 вне форума Ответить с цитированием
Старый 16.05.2019, 10:36   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Константин01 Посмотреть сообщение
Моя попытка: я предположил, что здесь можно использовать числа Каталана
простите, а как числа Каталана связаны с
Цитата:
Сообщение от Константин01 Посмотреть сообщение
Задача динамического программирования
?

по моему, тут нужно взять массив размером n и заполнить сначала его.

теория по ДП - https://acm.susu.ru/materials/05_dynprog.pdf

Последний раз редактировалось Serge_Bliznykov; 16.05.2019 в 10:38.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.05.2019, 12:24   #3
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

Набросал решение на C# (на С++ переведите сами)

Код:
using System;
namespace ConsoleApp
{
    class Program
    {
        static int[] Data = new int[38];
        static int[] Data_tmp = new int[38];
        static void Main(string[] args)
        {
            int n = 2;
            int k = 4;

            Data[n] = 1;
            for (int i = 0; i < k; i++)
            {
                for (int j = 0; j < 38; j++)
                {
                    Data_tmp[j] = 0;
                    if (j > 1) Data_tmp[j] += Data[j - 1];
                    if (j < 36) Data_tmp[j] += Data[j + 1];
                }
                for (int j = 0; j < 38; j++)
                    Data[j] = Data_tmp[j];
            }
            Console.WriteLine(Data[0]);
            Console.ReadLine();
        }
    }
}
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."
val_nnm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа в Си задача №90 acmp.ru kkhr Помощь студентам 3 05.12.2018 19:33
Acmp задача Dovbaka Помощь студентам 5 23.05.2017 07:56
Задача с acmp, сортировка по алфавиту Heirat Паскаль, Turbo Pascal, PascalABC.NET 3 13.02.2016 18:12
задача о ранце на С# методом динамического программирования Fiamma Помощь студентам 7 11.04.2014 11:37
Stack overflow (C++) (Задача с acmp №9) Ghost3 Помощь студентам 4 15.04.2013 18:41