Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
F問題 Sum of Numbers
作者 怒髪 (@dohatsutsu)
問題概要
a以上b以下の整数が書かれたカードがそれぞれc
枚ずつあるとき、その中からd枚のカードを選び、
そのカードに書かれてある整数の合計がeになる
場合の数を求めなさい。(mod 1,000,000,007)
問題概要
a=2,b=6,c=2,d=4,e=16のとき
{2,2,3,3,4,4,5,5,6,6}の10枚の中から、4枚選び合
計が16になる場合の数は、 {2,2,6,6},{2,3,5,6},
{2,4,4,6},{2,4,5,5},{3...
説明の前に、、、
dp[ i ][ j ] = i 枚のカードを選択して合計が j になる
場合の数
とおきます。
{2,2,3,3,4,4,5,5,6,6}の10枚の中から、4枚選び合
計が16になる場合の数
数字の2を使わないもの
{3,3,4,6},{3,3,5,5},{3,4,4,5}
数字の2を1つ使うもの
{2,3,5,6},{2,4,4,6},...
数字の2を使わないものについて
{2,2,3,3,4,4,5,5,6,6}の12枚の中から、4枚選び合
計を12にしたあと、全部の数字を1増やす。
{2,2,3,5},{2,2,4,4},{2,3,3,4}
{3,3,4,6},{3,3,5,5...
数字の2を1つ使うものについて
{2,2,3,3,4,4,5,5,6,6}の12枚の中から、3枚選び合
計が11にしたあと、全部の数字を1増やし、数字の
2を1つ追加する。
{2,3,6}, {2,4,5}, {3,3,5}, {3,4,4}
...
数字の2を2つ使うものについて
{2,2,3,3,4,4,5,5,6,6}の12枚の中から、2枚選び合
計が10にしたあと、全部の数字を1増やし、数字の
2を2つ追加する。
{4,6} ,{5,5}
{2,2,5,7},{2,2,6,6}
数字の7を使ってしまっているものについて
{2,3,4,7},{2,2,5,7}
数字の7を1つ取り除くと、{2,3,4},{2,2,5}となり、3
枚で合計が9になっている。もちろんこれはdp[3][9]
に対応する。
(数字の7を2枚使って...
{2,2,3,3,4,4,5,5,6,6}の12枚の中から、4枚選び合計が
16になる場合の数
dp[4][16]=dp[4][12] (数字の2を使わないもの)
+dp[3][11] (数字の2を1つ使うもの)
+dp[2][10] (数字の...
解法
dp[ i ][ j ] = i 枚のカードを選択して合計が j になる
場合の数
dp[ i ][ j ] = Σ dp[ i - k ][ j - i - (a-1) * k ]
     -Σ dp[ i - k ][ j - (b...
高速化について
この漸化式を普通に計算しようとすると、O(cde)と
なりTLEになってしまう。
しかし、累積和を計算しておくことにより、Σの部分
の計算にループを用いる必要がなくなり、O(de)に
することができる。
メモリの節約について
int dp[1001][20001];と宣言するとMLEになってしまい
ます。
しかし最大でもc+1行前までしか参照しないため、dp
[101][20001];の配列を宣言し、再利用しながら計算し
ましょう。
First Accept - なし
問題の背景
蟻本のp66,67
AOJのid0097
これらを応用して問題を作りました。
ジャッジ解
@dohatsutsu (c++ 0.41sec 25776KB 35行)
(JAVA 0.66sec 46988KB 48行)
@zukky162 さん (c++ 0.88sec 53200KB 67行)
Upcoming SlideShare
Loading in …5
×

RUPC2015Day2 - F

703 views

Published on

立命館大学競技プログラミング合宿2015Day2

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

RUPC2015Day2 - F

  1. 1. F問題 Sum of Numbers 作者 怒髪 (@dohatsutsu)
  2. 2. 問題概要 a以上b以下の整数が書かれたカードがそれぞれc 枚ずつあるとき、その中からd枚のカードを選び、 そのカードに書かれてある整数の合計がeになる 場合の数を求めなさい。(mod 1,000,000,007)
  3. 3. 問題概要 a=2,b=6,c=2,d=4,e=16のとき {2,2,3,3,4,4,5,5,6,6}の10枚の中から、4枚選び合 計が16になる場合の数は、 {2,2,6,6},{2,3,5,6}, {2,4,4,6},{2,4,5,5},{3,3,4,6}, {3,3,5,5},{3,4,4,5} の7通りである。
  4. 4. 説明の前に、、、 dp[ i ][ j ] = i 枚のカードを選択して合計が j になる 場合の数 とおきます。
  5. 5. {2,2,3,3,4,4,5,5,6,6}の10枚の中から、4枚選び合 計が16になる場合の数 数字の2を使わないもの {3,3,4,6},{3,3,5,5},{3,4,4,5} 数字の2を1つ使うもの {2,3,5,6},{2,4,4,6},{2,4,5,5} 数字の2を2つ使うもの {2,2,6,6}
  6. 6. 数字の2を使わないものについて {2,2,3,3,4,4,5,5,6,6}の12枚の中から、4枚選び合 計を12にしたあと、全部の数字を1増やす。 {2,2,3,5},{2,2,4,4},{2,3,3,4} {3,3,4,6},{3,3,5,5},{3,4,4,5}
  7. 7. 数字の2を1つ使うものについて {2,2,3,3,4,4,5,5,6,6}の12枚の中から、3枚選び合 計が11にしたあと、全部の数字を1増やし、数字の 2を1つ追加する。 {2,3,6}, {2,4,5}, {3,3,5}, {3,4,4} {2,3,4,7},{2,3,5,6},{2,4,4,6},{2,4,5,5}
  8. 8. 数字の2を2つ使うものについて {2,2,3,3,4,4,5,5,6,6}の12枚の中から、2枚選び合 計が10にしたあと、全部の数字を1増やし、数字の 2を2つ追加する。 {4,6} ,{5,5} {2,2,5,7},{2,2,6,6}
  9. 9. 数字の7を使ってしまっているものについて {2,3,4,7},{2,2,5,7} 数字の7を1つ取り除くと、{2,3,4},{2,2,5}となり、3 枚で合計が9になっている。もちろんこれはdp[3][9] に対応する。 (数字の7を2枚使っている場合、{?,?,7,7}となり、 残りの2枚の合計は2になるはずなので、これは dp[2][2]に対応する。)
  10. 10. {2,2,3,3,4,4,5,5,6,6}の12枚の中から、4枚選び合計が 16になる場合の数 dp[4][16]=dp[4][12] (数字の2を使わないもの) +dp[3][11] (数字の2を1つ使うもの) +dp[2][10] (数字の2を2つ使うもの) -dp[3][9]-dp[2][2] (数字の7は使用できないため) =3+4+2-2-0 =7
  11. 11. 解法 dp[ i ][ j ] = i 枚のカードを選択して合計が j になる 場合の数 dp[ i ][ j ] = Σ dp[ i - k ][ j - i - (a-1) * k ]      -Σ dp[ i - k ][ j - (b+1) * k ] c k=0 k=1 c
  12. 12. 高速化について この漸化式を普通に計算しようとすると、O(cde)と なりTLEになってしまう。 しかし、累積和を計算しておくことにより、Σの部分 の計算にループを用いる必要がなくなり、O(de)に することができる。
  13. 13. メモリの節約について int dp[1001][20001];と宣言するとMLEになってしまい ます。 しかし最大でもc+1行前までしか参照しないため、dp [101][20001];の配列を宣言し、再利用しながら計算し ましょう。
  14. 14. First Accept - なし
  15. 15. 問題の背景 蟻本のp66,67 AOJのid0097 これらを応用して問題を作りました。
  16. 16. ジャッジ解 @dohatsutsu (c++ 0.41sec 25776KB 35行) (JAVA 0.66sec 46988KB 48行) @zukky162 さん (c++ 0.88sec 53200KB 67行)

×