kmjp's blog

競技プログラミング参加記です

yukicoder : No.27 板の準備

これも★3か迷うところ。でも★2よりはややこしいかな。
http://yukicoder.me/problems/32

問題

長さがV0,V1,V2,V3の4つの板を作りたい。

そのため、3種類の長さの板を無限に準備できる。
これらの板は、切断は出来ないが連結は可能である。

4つの板を作るのに必要な最小の板の数を求めよ。

解法

Viは30以下なので、準備する板の長さも30以下で良い。
よって3つの板の長さを1~30で総当たりする。

あとはその3つの長さで4つの板を作れるか、メモ化再帰やDPで求めればよい。

int V[4];
int A,B,C;

int memo[51];

int dodo(int D) {
	if(D==0) return 0;
	if(D<0) return 1000;
	if(memo[D]>=0) return memo[D];
	return memo[D]=1+min(min(dodo(D-A),dodo(D-B)),dodo(D-C));
}

void solve() {
	int i,j,k,l,r,x,y; string s;
	cin>>V[0]>>V[1]>>V[2]>>V[3];
	int mi=V[0]+V[1]+V[2]+V[3];
	
	for(A=1;A<=30;A++) for(B=A+1;B<=30;B++) for(C=B+1;C<=30;C++) {
		MINUS(memo);
		mi=min(mi,dodo(V[0])+dodo(V[1])+dodo(V[2])+dodo(V[3]));
	}
	cout << mi << endl;
}

まとめ

yukicoderはしばしば難易度補正が入るので、時々チェックしないとね。