【题解】P6173 [USACO16FEB] Circular Barn P
题意
有顺时针编号的
思路
在一个环上比较难考虑,因此我们断环为链,这里需要
设
其中
这个做法是
通过打表可以发现对于
满足四边形不等式,故满足决策单调性,考虑使用分治优化,最终时间复杂度为
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e3+5,M=15,inf=(int)4e18+5;
int a[N<<1],w[N<<1][N<<1],dp[N][M];
void solve(int bgn,int id,int l,int r,int lpt,int rpt)
{
if(l>r)return;
int mid=l+r>>1,opt;
for(int i=lpt;i<=min(mid,rpt);i++)
{
int val=dp[i][id-1]+w[i+bgn][mid+bgn-1];
if(dp[mid][id]>val)dp[mid][id]=val,opt=i;
}
solve(bgn,id,l,mid-1,lpt,opt),solve(bgn,id,mid+1,r,opt,rpt);
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i],a[i+n]=a[i];
for(int i=1;i<=(n<<1);i++)
for(int j=i+1;j<=(n<<1);j++)
w[i][j]=w[i][j-1]+a[j]*(j-i);
int ans=inf;
for(int i=1;i<=n;i++)
{
for(int j=1;j<N;j++)
for(int k=0;k<M;k++)
dp[j][k]=inf;
for(int j=1;j<=m;j++)solve(i,j,0,n,0,n);
ans=min(ans,dp[n][m]);
}
cout<<ans;
return 0;
}