标签:
题意:
给一个长度为 NN 的一维格子和一些炸弹的位置,请你计算 “最大总破坏指数”。
每个炸弹都有向左和向右的破坏力,如果一个炸弹向左和向右的破坏力分别为 LL 和 RR,
那么该炸弹将炸毁 L + R + 1L+R+1 个格子(左边LL个,炸弹所在格子,右边RR个)。
破坏指数的计算方式为:所有炸弹炸毁的格子数的乘积。假设第 ii 个炸弹炸毁了 X_iX?i??个格子,
那么总破坏指数就是 X_1 * X_2 * .... X_mX?1??∗X?2??∗....X?m??。
现在告诉你每个炸弹的位置,你需要计算 最大的总破坏指数,注意:每个格子最多只允许被炸一次。
题解:
DP
设定f[i][j] 表示前i个炸弹到j的最大破坏力
我们在得知f[i][k]下 枚举当前炸弹左右范围更新答案就好了
#pragma comment(linker, "/STACK:10240000,10240000") #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<iostream> const int N = 2e3+10 , M = 1e6+20; using namespace std; typedef long long ll; int T,n,m; double f[N][N]; int a[N],x; int main() { scanf("%d",&T); while(T--) { scanf("%d%d",&m,&n); for(int i=1;i<=n;i++) scanf("%d",&x), a[i] = x + 1; sort(a+1,a+n+1); memset(f,0,sizeof(f)); f[0][0] = 0.0; a[0] = 0, a[n+1] = m+1; for(int i=1;i<=n;i++) { for(int j=a[i];j<a[i+1];j++) { for(int k=a[i-1]+1;k<=a[i];k++) { f[i][j] = max(f[i][j], f[i-1][k-1] + log(j-k+1)/ log(2)); } } } printf("%lld\n",(ll)floor(1000000*f[n][m])); } return 0; }
HDU 5653 Bomber Man wants to bomb an Array. DP
标签:
原文地址:http://www.cnblogs.com/zxhl/p/5335162.html