题意:
现在有n个人,s个位置和你可以划分长k个区域你可以把s个位置划分成k个区域,这样每个人坐下你的代价是该区域内,在你之前比你小的人的数量问你怎么划分这s个位置(当然,每个区域必须是连续的),才能使得总代价最小,输出代价。
分析:
dp[i][j]表示第i个位置是第j个区域的结尾,dp[i][j]→dp[t][j+1]暴力转移。但是需要预处理每个范围里的代价值,需要树状数组维护。#includeusing namespace std;const int maxn = 1050;int dp[maxn][55];int sum[maxn][maxn];int r[maxn];int n,m,k;int a[maxn];vector E[maxn];int lowbit(int x){ return x&(-x);}int get(int x){ int ans = 0; for(int i=x;i;i-=lowbit(i)) ans+=a[i]; return ans;}void update(int x,int v){ for(int i=x;i