【문제풀이】LuoGu2473: 보상 관문

본제 전송문 dpi, jdp{i, j} dpi, j는 i라운드까지 1~1 i-1 i-1 i-1 i-1 - 1라운드에서 보상 집합을 jjj의 답으로 순차적으로 추진하면 불합리한 결과를 내놓을 수 있으므로 역추를 통해 kk번호 1개를 매거하는 데 있어 현재 선행 조건인 dpi, j+= max(dpi + 1, j, dpi + 1, j, dpi + 1, j∣= (1Code:
#include 
#define maxn 110
#define maxm 100010
using namespace std;
double dp[maxn][maxm];
int n, m, power[maxn], a[maxn], p[maxn];

inline int read(){
	int s = 0, w = 1;
	char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
	for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
	return s * w;
}

int main(){
	m = read(), n = read();
	power[0] = 1;
	for (int i = 1; i <= n; ++i) power[i] = power[i - 1] << 1;
	for (int i = 1; i <= n; ++i){
		p[i] = read();
		int x = read();
		while (x) a[i] |= power[x - 1], x = read();
	}
	for (int i = m; i; --i)
		for (int j = 0; j < power[n]; ++j){
			for (int k = 1; k <= n; ++k)
				if ((j & a[k]) == a[k]) dp[i][j] += max(dp[i + 1][j], dp[i + 1][j | power[k - 1]] + p[k]);
				else dp[i][j] += dp[i + 1][j];
			dp[i][j] /= n;
		}
	printf("%.6lf
"
, dp[1][0]); return 0; }

좋은 웹페이지 즐겨찾기