1

以下のコードを使用したいのですが、「不明なサイズの入力」に使用したいと考えています。たとえば、配列がありint cac[1000][1000]ます。を使用できますvector<vector<int> > array;が、どのように初期化でき-1ますか? 助言がありますか?

#include <sstream>
#include <iostream>
#include <vector>
#include <cstdlib>
#include <memory.h>

using namespace std;

int cac[1000][1000];
string res[1000][1000];
vector<string> words;
int M;

int go(int a, int b){
 if(cac[a][b]>= 0) return cac[a][b];
 if(a == b) return 0;

 int csum = -1;
 for(int i=a; i<b; ++i){
  csum += words[i].size() + 1;
 }
 if(csum <= M || a == b-1){
  string sep = "";
    for(int i=a; i<b; ++i){
        res[a][b].append(sep);
        res[a][b].append(words[i]);
        sep = " ";
    }
  return cac[a][b] = (M-csum)*(M-csum);
 }

 int ret = 1000000000;
 int best_sp = -1;
 for(int sp=a+1; sp<b; ++sp){
 int cur = go(a, sp) + go(sp,b);
 if(cur <= ret){
    ret = cur;
    best_sp = sp;
 }
 }
 res[a][b] = res[a][best_sp] + "\n" + res[best_sp][b];
 return cac[a][b] = ret;
 }


int main(int argc, char ** argv){
memset(cac, -1, sizeof(cac));
M = atoi(argv[1]);
string word;
while(cin >> word) words.push_back(word);
go(0, words.size());
cout << res[0][words.size()] << endl;
}
4

2 に答える 2

0

STLからstd::vectorを使用することは、この投稿のコメントで指摘された次のソリューションよりもはるかに簡単です。このサイトはそのトピックを効果的に説明していることがわかりました:http://www.learncpp.com/cpp-programming/16-2-stl-containers-overview/

無限のサイズの配列は実際には不可能です。ただし、基本的には動的割り当てを使用してその効果を実現できます。サンプルコードは次のとおりです。

int counter = 0;
int* myArray = new int[1000];

配列にデータを入力し、値を追加するたびにカウンターをインクリメントします。カウンターが1000に達したら、以下を実行します。

int* largerArray = new int[2000];
for( int i = 0; i < 1000; i++ )
{
    largerArray[i] = myArray[i];
}
delete[] myArray;
myArray = largerArray;

この方法を使用すると、無限のサイズの配列に可能な限り近いものを作成できます。コピーピースのパフォーマンスが問題になるとは思われません。

于 2012-05-03T20:15:15.587 に答える
0

できることは、キーがペア(rowPositionColumnPosition)である連想配列を使用することです。設定したい場合array[i][j]は、値を追加または更新するだけですassoArray[Pair(i,j)]。連想配列にない要素はすべて初期値を持つと想定できます。

一般に、無限の多次元配列は理論的な目的で使用されます。質問を誤解していないことを願っています。

于 2012-05-03T19:10:12.103 に答える