SRM533 Div1 Easy - CasketOfStar

問題

星がn個あり、i個目の星の重さはw[i]である
「両端以外の任意の星を1つ選んで消し、その左右にある星の重みの積をスコアに加える」という操作を可能な限り繰り返す
最終的なスコアの最大値を求めよ

3 <= n <= 50
1 <= w[i] <= 1000

解法

dp[l][r]: 区間[l,r]における問題の答え
とし、r-l=2から始めて幅を増やしながら
dp[l][r] = max(dp[l][i]+dp[i][r]+w[l]*w[r]) (l<i<r)
という遷移をすれば解ける

class CasketOfStar {
public:
	int maxEnergy(vector<int> w) {
		int n = w.size(), dp[55][55] = {};
		reps(d,2,n) rep(l,n-d) {
			int r = l+d;
			reps(i,l+1,r) chmax(dp[l][r], dp[l][i] + dp[i][r] + w[l]*w[r]);
		}
		return dp[0][n-1];
	}
};