Member 11091380 Ответов: 1

Я взял код для icpc2013 problem H: matryoshkas dolls он работает правильно, но я не понимаю его функционирования, пожалуйста, помогите мне понять его.


<pre>#include <cstring>
#include <iostream>
#include <set>
using namespace std;

#define MAXN 1000

int N;
int doll[MAXN+1], dollv[2014], retcost[MAXN+1];
int cost[MAXN+1][MAXN+1], mx[MAXN+1][MAXN+1];

main() 
{
 cout<<"\n\033[1m\033[32m Enter the number of test cases:  ";
  while (cin >> N) 
{
    cout<<"\n\033[1m\033[33mEnter the doll sizes:  ";
    for (int i = 0; i < N; i++) cin >> doll[i];
    memset(cost, 63, sizeof(cost));
    memset(mx, 0, sizeof(mx));
    for (int i = N-1; i >= 0; i--) 
{
      cost[i][i+1] = 0;
      memset(dollv, 0, sizeof(dollv));
      set<int> sorted;
      for (int j = i; j < N; j++) 
{
        if (dollv[doll[j]]) break;
        dollv[doll[j]] = true;
        mx[i][j+1] = max(mx[i][j], doll[j]);
        sorted.insert(doll[j]);

        set<int>::iterator smallest = sorted.end();
        --smallest;
        int seqsize1 = sorted.size(), seqsize2 = 0;
        for (int k = j+1; k < N; k++) 
	{
          if (dollv[doll[k]]) break;
          while (seqsize1 && doll[k] < *smallest) 
	  {
            --seqsize1;
            if (smallest != sorted.begin()) --smallest;
          }
          if (!seqsize1 && doll[k] < *smallest) 
	  {

            ++seqsize2;
          }
          cost[i][k+1] = min(cost[i][k+1], cost[i][j+1] + cost[j+1][k+1] +(k+1-i) - max(seqsize1, seqsize2));
        }
      }
    }

    memset(retcost, 63, sizeof(retcost));
    retcost[0] = 0;
    for (int i = 0; i < N; i++) if (retcost[i] < 1000000000) 
{
      for (int j = i; j < N; j++) if (mx[i][j+1] == j+1-i) 
	{
        retcost[j+1] = min(retcost[j+1], retcost[i] + cost[i][j+1]);
        }
}
    if (retcost[N] < 1000000000) 
      {
	cout<<"\n\033[1m\033[34mNumber of openings:  ";
	cout << retcost[N] << endl;
	cout<<"\n";
	return 0;
      } 
	else
 	 {
      		cout << "\t\n\033[1m\033[31mImpossible!!\n" << endl;
		return 0;
         }
  }
}


Что я уже пробовал:

условия испытания:
1)
количество тестовых случаев: 7
1 2 3 2 4 1 5
количество отверстий: 7
2)
количество тестовых случаев: 7
1 2 1 2 4 3 3
Это невозможно!!

1 Ответов

Рейтинг:
0

OriginalGriff

Вы хоть представляете, как много работы по построчному объяснению кода?
Каждая строка нуждается в пояснении! Например:

int next = r.Next();

Создайте новую переменную под названием "next", которая может содержать целочисленное значение. Из ранее объявленного случайного экземпляра " r "вызовите метод" Next", чтобы получить новое случайное число, и назначьте его переменной" next".

Вы можете себе представить, сколько времени нам потребуется, чтобы объяснить даже такой очень короткий фрагмент кода, как ваш пример, строка за строкой?

Нет, этого не произойдет. Если у вас есть конкретная проблема, то задайте вопрос о ней. Но сначала подумайте - хотите ли вы сесть на 45 минут и напечатать построчное описание без веской причины?

Если вы не понимаете его, либо напишите его сами, либо вернитесь туда, откуда вы взяли код, и спросите там: мы здесь не для того, чтобы объяснять вам вашу домашнюю работу!