Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 20.02.2012
Сообщений: 8

Удалить символы из строки за минимальное количество ходов.

20.02.2012, 21:21. Показов 3778. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Удалить символы из строки за минимальное количество ходов.

Пример
input.txt
acdcbbc
output.txt
4


вот что Я набодяжил, но не работает, может подскажите в чем ошибка

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
 #include <fstream>
 using namespace std;
 
 int main()
 {
 char S[300];
 
 ifstream in("in.txt";
 in >> S;
 in.close();
 
 
 int n = strlen(S);
 int **A = new int*[n];
 for(int i = 0; i < n; i++)
 A[i] = new int[n];
 
 for( int i = 0; i < n; i++ )
 for( int j = 0; j < n; j++ ){
 if( i != j )
 A[i][j]=0;
 else
 A[i][i] = 1;//главная диагональ
 }
 for( int i = 0; i < n-1; i++ )//заполнение диагонали над главной
 {
 if( S[i] == S[i+1] )
 A[i][i+1] = 1;
 else
 A[i][i+1] = 2;
 }
 
 bool flag;
 
 for( int i = 0; i < n; i++ ){
 for( int j = 0; j < n-i; j++ ){
 for( int k = j+1; k < i+j; k++ ){
 if(S[k] == S[j]){
 
 A[j][i+j] = A[j+1][k-1] + A[k][i+j];
 
 if( A[j][i+j] >= ( A[j+1][k-1] + A[k][i+j] ) )
 A[j][i+j] = A[j+1][k-1] + A[k][i+j];
 
 }
 if( S[k] != S[j] )
 A[j][i+j] = 1 + A[j+1][i+j];
 }
 }
 }
 
 
 cout<<A[0][n-1];
 return 0;
 }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.02.2012, 21:21
Ответы с готовыми решениями:

Найти минимальное количество ходов коня(со сбитием фигур)
Добрый вечер! Исходная задача: Имеется шахматная доска N&lt;=1 000 на M &lt;=1 000 клеток (верхний левый квадрат доски имеет координаты...

За какое минимальное количество ходов белый король доберётся до позиции чёрного?
нужно найти программное решение такой проблемы: на шахматной доске есть два короля Чёрный и Белый.Позиции любые. вопрос: за какое...

Удалить все символы из строки кроме группы(известно количество) цифр
Ребят подскажите как будет лучше реализовать сделующую задачу: в поле мемо имеется порядка 10 000 строк примерно такого содержимого:...

15
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
21.02.2012, 05:02
Цитата Сообщение от Toxas Посмотреть сообщение
может подскажите в чем ошибка
может подскажите условие задачи, или хотя бы ту часть, в которой описаны правила удаления символов из строки.
0
0 / 0 / 0
Регистрация: 20.02.2012
Сообщений: 8
21.02.2012, 17:26  [ТС]
За один ход разрешается удалить один или несколько подряд идущих одинаковых символов.

Добавлено через 43 секунды
Цитата Сообщение от valeriikozlov Посмотреть сообщение
может подскажите условие задачи, или хотя бы ту часть, в которой описаны правила удаления символов из строки.
За один ход разрешается удалить один или несколько подряд идущих одинаковых символов.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
21.02.2012, 17:40
Цитата Сообщение от Toxas Посмотреть сообщение
Удалить символы из строки за минимальное количество ходов.
Которые встречаются больше одного раза, или одинаковые подряд идущие? Или еще какие-нибудь...
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
21.02.2012, 18:00
go, здесь получается так:
Исходная строка:
acdcbbc
- Первым удаляем символ d. Остается accbbc
- Вторым удаляем символы bb. Остается accc
- Третьим удаляем символы ccc. Остается a
- Четвертым удаляем a
Итого ответ:4
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
21.02.2012, 18:11
Цитата Сообщение от Toxas Посмотреть сообщение
Удалить символы из строки за минимальное количество ходов.
Пример
input.txt
acdcbbc
output.txt
4
- правда вышло за 3 операции удаления
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <fstream>
using namespace std;
 
int retWithCode(char * msg, int code)
{
    cout<<msg<<endl;
    system("pause");
    return code;
}
 
int main()
{
    ifstream ifs;
    char * text = NULL;
    char * line = NULL;
    long i, j, len = 0;
    long nOperations=0;
    ifs.open("input.txt");
    if(!ifs)
        return retWithCode("Error open input.txt", 1);
    ifs.seekg(0,ios::end);
    len = ifs.tellg();
    ifs.seekg(0,ios::beg);
    if(!(text = new char[1 + len]))
        return retWithCode("Allocation memory error", 1);
    ifs.read(text,len);
    ifs.close();
    text[len] = '\0';
    for(i = 0; text[i + 1] != '\0'; i++)
    {
        len = strlen(text);
        while((line = strchr(text + i + 1,text[i])))
        {
            j = len - strlen(line);
            if(j <= len - 1)
            if(strcpy(&text[j],&text[j + 1]))
            {
                text[(len = len - 1)] = '\0';
                nOperations = nOperations + 1;
            }
        }
    }
    cout<<text<<endl;
    cout<<"Num of operations : "<<nOperations<<endl;
    return retWithCode("End of algorithm", 0);
}
Миниатюры
Удалить символы из строки за минимальное количество ходов.  
Вложения
Тип файла: txt input.txt (7 байт, 7 просмотров)
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
21.02.2012, 18:13
valeriikozlov, взаимосвязь не уловил.
Цитата Сообщение от valeriikozlov Посмотреть сообщение
- Первым удаляем символ d. Остается accbbc
По каким критериям выбирали?
0
21.02.2012, 18:16

Не по теме:

valeriikozlov, go, думаю нужно банально удалить все многократные вхождения символов в строку...

0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
21.02.2012, 19:04
go, можно например и так:
Исходная строка:
acdcbbc
- Первым удаляем символ a. Остается cdcbbc
- Вторым удаляем символ d. Остается ccbbc
- Третьим удаляем символы bb. Остается ccc
- Четвертым удаляем символы ccc
Итого ответ:4
Все по условию:
Цитата Сообщение от Toxas Посмотреть сообщение
За один ход разрешается удалить один или несколько подряд идущих одинаковых символов.
Добавлено через 3 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Не по теме:
valeriikozlov, go, думаю нужно банально удалить все многократные вхождения символов в строку...
Если банально удалять, то даже для примера:

Цитата Сообщение от Toxas Посмотреть сообщение
Пример
input.txt
acdcbbc
output.txt
4
не получится

Добавлено через 16 минут
Toxas, все-таки мало данных по задаче.
Какова максимальная длинна строки. Какие символы в строке могут использоваться? Только маленькие латинские буквы или еще какие-нибудь?
0
0 / 0 / 0
Регистрация: 20.02.2012
Сообщений: 8
22.02.2012, 01:40  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- правда вышло за 3 операции удаления
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <fstream>
using namespace std;
 
int retWithCode(char * msg, int code)
{
    cout<<msg<<endl;
    system("pause");
    return code;
}
 
int main()
{
    ifstream ifs;
    char * text = NULL;
    char * line = NULL;
    long i, j, len = 0;
    long nOperations=0;
    ifs.open("input.txt");
    if(!ifs)
        return retWithCode("Error open input.txt", 1);
    ifs.seekg(0,ios::end);
    len = ifs.tellg();
    ifs.seekg(0,ios::beg);
    if(!(text = new char[1 + len]))
        return retWithCode("Allocation memory error", 1);
    ifs.read(text,len);
    ifs.close();
    text[len] = '\0';
    for(i = 0; text[i + 1] != '\0'; i++)
    {
        len = strlen(text);
        while((line = strchr(text + i + 1,text[i])))
        {
            j = len - strlen(line);
            if(j <= len - 1)
            if(strcpy(&text[j],&text[j + 1]))
            {
                text[(len = len - 1)] = '\0';
                nOperations = nOperations + 1;
            }
        }
    }
    cout<<text<<endl;
    cout<<"Num of operations : "<<nOperations<<endl;
    return retWithCode("End of algorithm", 0);
}
за 3 операции никак получится не может, или я что-то путаю

Добавлено через 37 секунд
Цитата Сообщение от valeriikozlov Посмотреть сообщение
go, можно например и так:
Исходная строка:
acdcbbc
- Первым удаляем символ a. Остается cdcbbc
- Вторым удаляем символ d. Остается ccbbc
- Третьим удаляем символы bb. Остается ccc
- Четвертым удаляем символы ccc
Итого ответ:4
Все по условию:


Добавлено через 3 минуты

Если банально удалять, то даже для примера:


не получится

Добавлено через 16 минут
Toxas, все-таки мало данных по задаче.
Какова максимальная длинна строки. Какие символы в строке могут использоваться? Только маленькие латинские буквы или еще какие-нибудь?
максимально 300 - длина строки, символы - только маленькие латинские
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
22.02.2012, 10:42
Toxas, вот так попробуйте:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
 #include <fstream>
 using namespace std;
 
 int main()
 {
 char S[301];
 
 ifstream in("in.txt");
 in >> S;
 in.close();
 
 
 int n = strlen(S);
 int **A = new int*[n];
 for(int i = 0; i < n; i++)
 A[i] = new int[n];
 
 for(  i = 0; i < n; i++ )
     A[i][i] = 1;//ãëàâíàÿ äèàãîíàëü
 
 for(i = 1; i < n; i++ )//çàïîëíåíèå äèàãîíàëè íàä ãëàâíîé
 {
     for(int j=i; j<n; j++)
     {
         int min;
         if(A[j-i][j-1]<A[j-i+1][j])
             min=A[j-i][j-1];
         else
             min=A[j-i+1][j];
         if(S[j-i]==S[j])
             A[j-i][j]=min;
         else
             A[j-i][j]=min+1;
     }
 
 }
 cout<<A[0][n-1];
 return 0;
 }
0
0 / 0 / 0
Регистрация: 20.02.2012
Сообщений: 8
22.02.2012, 14:30  [ТС]
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Toxas, вот так попробуйте:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
 #include <fstream>
 using namespace std;
 
 int main()
 {
 char S[301];
 
 ifstream in("in.txt");
 in >> S;
 in.close();
 
 
 int n = strlen(S);
 int **A = new int*[n];
 for(int i = 0; i < n; i++)
 A[i] = new int[n];
 
 for(  i = 0; i < n; i++ )
     A[i][i] = 1;//ãëàâíàÿ äèàãîíàëü
 
 for(i = 1; i < n; i++ )//çàïîëíåíèå äèàãîíàëè íàä ãëàâíîé
 {
     for(int j=i; j<n; j++)
     {
         int min;
         if(A[j-i][j-1]<A[j-i+1][j])
             min=A[j-i][j-1];
         else
             min=A[j-i+1][j];
         if(S[j-i]==S[j])
             A[j-i][j]=min;
         else
             A[j-i][j]=min+1;
     }
 
 }
 cout<<A[0][n-1];
 return 0;
 }

на тесте kdfdkfdfdkdf валиться, должно быть 7 выводит 8 , не понятно вовсе почему, алгоритм вроде правильный, видимо проверки нужны, я не знаю какие
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
22.02.2012, 14:34
Toxas,
Цитата Сообщение от Toxas Посмотреть сообщение
я не знаю какие
- а мы знаем что тебе надо???
kdfdkfdfdkdf - синим отмечены парные символы строки их 9, а ты хочешь 8-мь. Задание конкретезируй что именно надо удалять - парные символы либо все символы у которых есть пара - тогда строку надо вообще зарубать - т.к в ней все символы пповторяются.
И помни правильная постановка задачи - уже 50% на пути её решения...
0
0 / 0 / 0
Регистрация: 20.02.2012
Сообщений: 8
22.02.2012, 14:46  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Toxas, - а мы знаем что тебе надо???
kdfdkfdfdkdf - синим отмечены парные символы строки их 9, а ты хочешь 8-мь. Задание конкретезируй что именно надо удалять - парные символы либо все символы у которых есть пара - тогда строку надо вообще зарубать - т.к в ней все символы пповторяются.
И помни правильная постановка задачи - уже 50% на пути её решения...
Задача: Удалить за МИНИМАЛЬНОЕ количество ходов все символы из строки ( удалять за один ход можно одиночный символ либо n подряд идущих одинаковых символов ) acddcb - за первы ход удаляем dd, потом cc потом a и b итого = 4 хода минимально

Длина строки максимально - 300 символов, только маленькие латинские буквы!

я понимаю, что делать надо через матрицу, рассматривая подпоследовательности и от данных в массиве отталкивается, однако мой разбор не для всех случаев подходит, я привел пример какой случай разбирает неправильно, вот я и прошу помочь
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
22.02.2012, 15:21
Цитата Сообщение от Toxas Посмотреть сообщение
я понимаю, что делать надо через матрицу, рассматривая подпоследовательности и от данных в массиве отталкивается, однако мой разбор не для всех случаев подходит, я привел пример какой случай разбирает неправильно, вот я и прошу помочь
- можно записать S[0] = '\0'; после ввода и удалить за один присест сразу всё...
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
22.02.2012, 18:01
Цитата Сообщение от Toxas Посмотреть сообщение
на тесте kdfdkfdfdkdf валиться, должно быть 7 выводит 8 , не понятно вовсе почему, алгоритм вроде правильный, видимо проверки нужны, я не знаю какие
Все правильно, нужны дополнительные проверки. Вот так пробуйте сдавать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
 #include <fstream>
 using namespace std;
 
 int main()
 {
 char S[301];
 
 ifstream in("in.txt");
 in >> S;
 in.close();
 
 
 int n = strlen(S);
 int **A = new int*[n];
 for(int i = 0; i < n; i++)
 A[i] = new int[n];
 
 for(  i = 0; i < n; i++ )
         A[i][i] = 1;//главная диагональ
 
 for(i = 1; i < n; i++ )//заполнение диагонали над главной
 {
         for(int j=i; j<n; j++)
         {
                 int min;
                 if(A[j-i][j-1]<A[j-i+1][j])
                         min=A[j-i][j-1];
                 else
                         min=A[j-i+1][j];
                 if(S[j-i]==S[j])
                         A[j-i][j]=min;
                 else
                         A[j-i][j]=min+1;
                 for(int y=j-i+1; y<=j; y++)
                     if(A[y][j]+A[j-i][y-1]<A[j-i][j])
                         A[j-i][j]=A[y][j]+A[j-i][y-1];
         }
 
 }
 cout<<A[0][n-1];
 return 0;
 }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.02.2012, 18:01
Помогаю со студенческими работами здесь

Удалить из строки все символы ',' и '.', подсчитать общее количество символов 'X' и 'Y', стоящих после '*'
Удалить из строки все символы ',' и '.', подсчитать общее количество символов 'X' и 'Y', стоящих после '*'. #include&lt;string.h&gt; ...

Дано целое число K и текстовый файл. Удалить из каждой строки файла первые K символов (если длина строки меньше K, то удалить из нее все символы)
Помогите Пожалуйста написать программу! Дано целое число K и текстовый файл. Удалить из каждой строки файла первые K символов (если длина...

Задана строка, символы которой могут повторяться. Нужно удалить все символы строки с помощью наименьшего количества вычеркиваний
Задана строка, символы которой могут повторяться. За один ход разрешается вычеркнуть в любом месте строки один или несколько одинаковых...

Удалить из строки каждую пару символов '!?' и удалить некоторые символы
помогите решить задачу, пожалуйста. используя scanf для чтения. Удалить из строки каждую пару символов '!?', подсчитать количество...

Прохождение максимального количества ячеек поля, за минимальное число ходов
Добрый день, не знал где создать тему, решил написать здесь. Подкиньте пожалуйста идею как можно решить задачу: Дано поле, на котором...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru