アプリ版:「スタンプのみでお礼する」機能のリリースについて

=得点の付け方=
連続した3つの数=5点
連続した2つの数=4点
1つ間のあいた3つの数=3点
1つ間のあいた2つの数=2点
どこにもくつかない数=0点

(23345)→(234)(35)の7点 or (23)(345)の7点
(24468)→(246)(4)(8)の3点 or (24)(468)の5点

組み合わせの取り方で得点が異なり、最大得点を得るためにはどういった
ように考えればよいのでしょう?

A 回答 (2件)

>こういったcom関数を作りたいのですがどうやったらいいのか分かりません。



あまり良いコードではないかもしれませんが、参考にしてください。com の引数 n と r は nCr を意味します。作成される y は、8C3 の時に、
x = { 1, 2, 3, 4, 5, 6, 7, 8 }
y[0] = 1
y[1] = 2
y[2] = 3
y[3] = 1
y[4] = 2
y[5] = 4
y[6] = 1
y[7] = 2
y[8] = 5
という順番になります。

int *y;// y は int[nCr * r] のメモリが確保されている必要がある
int *x;// x は int[n] のメモリが確保されていて、適当に初期化されている必要がある

void com(int n, int r)
{
com_sub(y, 0, 0, n, r);
}

int *com_sub(int *write, int start, int nest, int n, int r)
{
int i, c;
if (nest < r)
{
for (i = start; i <= n - r + nest; i++)
{
if (i != start)
{
for (c = 0; c < nest; c++)
{
*write++ = *(write - r);
}
}
*write = x[i];
write = com_sub(write + 1, i + 1, nest + 1, n, r);
}
}
return write;
}


おそらく、あらかじめ組み合わせリストを作成するよりも、再帰的に総当たりしていって、得点が以前のものを上回ったときに、その組み合わせを保存するようなコードを作成したほうがシンプルになると思います。
    • good
    • 0

体系化された得点配分ではないので、全部の組み合わせを試すのが最良の方法と思われます。

例示されている通りに5つの数字に対する得点を考えるとすれば、その組み合わせ数は、
 (3つの数字の組み合わせ、2つの数字の組み合わせ) = 10通り
 (3つの数字の組み合わせ、1つの数字、1つの数字) = 10通り
 (2つの数字の組み合わせ、2つの数字の組み合わせ、1つの数字) = 15通り
 (2つの数字の組み合わせ、1つの数字、1つの数字、1つの数字) = 10通り
 (全部1つの数字) =1通り
となり、合計46通りを調べれば済みます。プログラムで組むとすれば、簡単な話ですね。

以上。

この回答への補足

x[8]={0,1,2,5,6,7,8,10};
com(8,3);/*組み合わせy[]に入れる関数*/

y[0]={0,1,2};
y[1]={0,1,5};
y[2]={0,1,6};
・・・
y[8C3-1]={7,8,10};

こういったcom関数を作りたいのですがどうやったらいいのか分かりません。
助言をお願いします。com(int x,int y)といったように一般化してです。

補足日時:2002/02/16 20:06
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!