题目链接
题意:地址
分析:设dp[i][j]:表示当前考虑到第i个炸弹,其能往右边炸到的最远距离。暴力转移
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define cl(a,b) memset(a,b,sizeof(a))
const int maxn=2005;
const LL inf=1LL<<32;
double pi=acos(-1.0);
#define gcd __gcd
#define LCM(a,b) (a)*(b)/gcd(a,b)
#define X first
#define Y second
#define pb push_back
double dp[maxn][maxn];
int a[maxn];
int main(){
int T;scanf("%d",&T);
while(T--){
int n,m;scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d",&a[i]);a[i]++;
}
sort(a+1,a+1+m);a[m+1]=n+1;a[0]=0;
cl(dp,0);
for(int i=1;i<=m;i++){/*
收获是在这个for,开始写的是for a[i]+1:a[i+1]
这样可能会导致a[i]自己本身无法进入
*/
for(int r=a[i];r<=a[i+1]-1;r++){
for(int l=a[i-1]+1;l<=a[i];l++){
dp[i][r]=max(dp[i][r],dp[i-1][l-1]+log2(r-l+1));
}
}
}
printf("%.0lf\n",floor(1e6*1.0*dp[m][n]));
}
return 0;
}