TopCoder Open 2014 Round1A Medium EllysScrabble

問題

文字列Sが与えられる。
文字を並べ替えて文字列Tを作る。
Tのそれぞれの文字は、Sの元の場所から距離i以内の場所になければならない。


できる文字列のうち辞書順で最小のものを求めよ。

制約条件

Sの長さ≦50

方針

一文字ずつ決めうちしたときに残りで文字列を作れるか、
二部グラフのマッチングをして解いた。


本当はただの貪欲で解けて、
使える文字のうち辞書順で最小のものを、
複数あれば一番奥のものから使えばよいだけ。

ソースコード

class EllysScrabble {
	public:
	string getMin(string letters, int maxDistance) {
		
		int n = letters.size();
		string ans;
		
		int s = 2 * n, t = 2 * n + 1;
		
		rep(i, n){
			ans += 'A';
			rep(j, 26){
				
				flowGraph g(2 * n + 2);
				
				rep(k, n){
					g.add(s, k, 1);
					for(int l = 0; l <= i; l++)
						if(ans[l] == letters[k] && abs(k-l) <= maxDistance) g.add(k, l + n, 1);
					
					for(int l = i + 1; l < n; l++)
						if(abs(k - l) <= maxDistance) g.add(k, l + n, 1);
					
					g.add(k + n, t, 1);
				}
				if(g.max_flow(s, t) >= n) break;
				
				ans[i]++;
			}
		}
		return ans;
	}
};