[JZOJ P1311] [DP]邮局设置问题
生活随笔
收集整理的這篇文章主要介紹了
[JZOJ P1311] [DP]邮局设置问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
@kaike
傳送門
學了DP我依舊一臉懵逼,這題大概和資源分配問題相似。枚舉f[i][j]表示前i個有j個東西。
讓求距離差,兩個循環去枚舉區間[i....j]的距離差。用w[i][j]表示區間[i....j]的距離差,
w[i][j]就是從前一個狀態w[i][j-1]加上a[j]到中點的距離。
預處理也是DP。
把每個郵局放到每個村莊里的距離就是0.f[i][i]=0;當郵局小于村莊時就不要考慮這個問題辣。
前i個村莊里只有一個郵局的話,f[i][1]的值就和前i個村莊的距離差就相等;f[i][1]=w[1][i];
最終式子為:f[i][j]=min(f[i][j],f[k][j-1]+w[k+1][j]);(j-1<=k< i)
前i個村莊里j個郵局就是 前k個村莊里j-1個郵局加上[k+1....j]的村莊里只有1個郵局。
?
#include<iostream> #include<algorithm> #include<cstdio> using namespace std; const int INF=999999; int n,m,a[310],w[310][310],f[310][35]; int main(){cin>>n>>m;for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++)w[i][j]=w[i][j-1]+a[j]-a[(i+j)/2];for(int i=1;i<=n;i++){f[i][i]=0;f[i][1]=w[1][i];}for(int j=2;j<=m;j++)for(int i=j+1;i<=n;i++){f[i][j]=INF;for(int k=j-1;k<i;k++)f[i][j]=min(f[i][j],f[k][j-1]+w[k+1][i]);}cout<<f[n][m]; } = =轉載于:https://www.cnblogs.com/Kaike/p/6307382.html
總結
以上是生活随笔為你收集整理的[JZOJ P1311] [DP]邮局设置问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eclipse 安装tomcat
- 下一篇: vue2.0 实现click点击当前li