読者です 読者をやめる 読者になる 読者になる

土下座しながら探索中

主に競技プログラミング

SRM205 Div2 hard HexagonalSums

問題概要:
n (1 <= n <= 1000000)が与えられる
n を hexagonal number の和で表した時に必要な最小の hexagonal number の数を返せ

解法:
DPで解いた
最初に n 以下の hexagonal number をベクターとかに入れておく
dp[n] := n を作るために必要な最小の hexagonal number の数
として

for i 0..(n 以下の hexagonal number の数)
  for j (i 番目の hexagonal number)..n
    dp[j] = min(dp[j],
                dp[j-(i 番目の hexagonal number)]+1)

とした
あれです、個数制限なしのナップザック問題です


コード;

int mincost[MAX+1];

class HexagonalSums {
	public:

  void createHex(vector<int> &hexa)
  {
    int value = 1;
    int diff = -1;
    while(value <= MAX)
      {
	hexa.push_back(value);
	value += (diff == -1?(diff=5):(diff=diff+4));
      }
  }

  int minLength(int N) {
    vector<int> hexa;
    createHex(hexa);  
    int n = hexa.size();
    N=N;
    rep(i,MAX+1)mincost[i] = INF;
    rep(i,n)mincost[hexa[i]] = 1;

    rep(i,n)
      for(int j=hexa[i];j<=N;j++)
	mincost[j] = min(mincost[j],
			 mincost[j-hexa[i]]+1);

    assert(mincost[N] != INF);
    return mincost[N];
  }
};