http://www.lydsy.com/JudgeOnline/problem.php?id=2448
一遍过,嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎,O(∩_∩)O~
题意是最小化最大值
设计区间dp
dp[i][j] 表示在能确定x不在区间[i,j]内,或确定x在区间[i,j]内某个位置的最坏情况下的最小值
dp[i][j]=min { max(dp[i][k-1],dp[k+1][j] ) + a[k] } k∈[i,j]
O(n^3)复杂度
#include<cstdio> #include<cstring> #include<iostream> using namespace std; #define N 2002 int a[N]; int dp[N][N]; void read(int &x) { x=0; char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); } } int main() { int n; read(n); for(int i=1;i<=n;++i) read(a[i]); memset(dp,63,sizeof(dp)); for(int i=1;i<=n;++i) dp[i][i]=a[i],dp[i][i-1]=0; for(int i=n;i;--i) for(int j=i;j<=n;++j) for(int k=i;k<=j;++k) dp[i][j]=min(dp[i][j],max(dp[i][k-1],dp[k+1][j])+a[k]); printf("%d",dp[1][n]); }