POJ 1160 区间DP + 平行四边形优化
来源:互联网 发布:2017年双十一实时数据 编辑:程序博客网 时间:2024/05/18 21:06
区间DP + 平行四边形优化
题意:
有n个村庄现在要建立m个邮局,问怎么建邮局才能使得村庄到最近的邮局距离和最小。输出距离和即可。
思路:
一般的区间dp是从小区间到大区间,而此题在此之外还有一个限制是m个邮局。对于此类问题可以直接建立dp的时候加上限制条件:
- 未优化代码。
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 305;const int INF = 0x3f3f3f3f;int n,m;int a[maxn];int one[maxn][maxn];int dp[maxn][maxn];int main(){ //freopen("in.txt","r",stdin); scanf("%d%d",&n,&m); for(int i = 1;i <= n; i++) { scanf("%d",&a[i]); } for(int i = 1;i <= n; i++) { for(int j = i;j <= n; j++) { if(i == j) one[i][j] = 0; else one[i][j] = one[i][j-1] + a[j] - a[(i+j)/2]; } } memset(dp,INF,sizeof(dp)); for(int i = 1;i <= n; i++) dp[i][1] = one[1][i]; for(int i = 2;i <= n; i++) { int End = min(m,i); for(int j = 2;j <= End; j++) { for(int k = 1;k <= i; k++) { if(dp[i][j] > dp[k][j-1] + one[k+1][i]) dp[i][j] = dp[k][j-1] + one[k+1][i]; } } } printf("%d\n",dp[n][m]); return 0;}
- 可以用四边形优化
平行四边形的ss数组是优化的核心,但是它是建立在:
而
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 305;const int INF = 0x3f3f3f3f;int n,m;int a[maxn];int one[maxn][maxn];int dp[maxn][maxn];int ss[maxn][maxn];int main(){ //freopen("in.txt","r",stdin); scanf("%d%d",&n,&m); for(int i = 1;i <= n; i++) { scanf("%d",&a[i]); } for(int i = 1;i <= n; i++) { for(int j = i;j <= n; j++) { if(i == j) one[i][j] = 0; else one[i][j] = one[i][j-1] + a[j] - a[(i+j)/2]; } } memset(dp,INF,sizeof(dp)); memset(ss,0,sizeof(ss)); for(int i = 1;i <= n; i++) dp[i][1] = one[1][i]; for(int i = 2;i <= n; i++) { int End = min(m,i); for(int j = 2;j <= End; j++) { ss[i+1][j] = i+1; for(int k = ss[i][j-1];k <= ss[i+1][j]; k++) { if(dp[i][j] > dp[k][j-1] + one[k+1][i]) { dp[i][j] = dp[k][j-1] + one[k+1][i]; ss[i][j] = k; } } } } printf("%d\n",dp[n][m]); return 0;}
- 还有一个版本是i和j的循环可以换一换
#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define inf 0x3f3f3f3fint dp[305][305];int x[305],one[305][305]={0};int K[305][305];int main(){ int N,M,i,j,k; // freopen("in.txt","r",stdin); while(cin>>N>>M){ for(i=1;i<=N;++i) scanf("%d",&x[i]); memset(dp,inf,sizeof(dp)); for(i=1;i<=N;++i) for(j=i;j<=N;++j) if(i==j) one[i][i]=0; else one[i][j]=one[i][j-1]+x[j]-x[(i+j)/2]; for(i=1;i<=N;++i) dp[i][1]=one[1][i]; for(i=1;i<=N;++i) K[i][i]=1; for(j=2;j<=M;++j) { for(i=1;i<=N;++i) { K[i+1][j]=i+1; if(j>i) continue; for(k=K[i][j-1];k<=K[i+1][j];++k) { int s=dp[k][j-1]+one[k+1][i]; if(dp[i][j]>s) { dp[i][j]=s; K[i][j]=k; } } } } printf("%d\n",dp[N][M]); } return 0;}
阅读全文
0 0
- POJ 1160 区间DP + 平行四边形优化
- 蓝桥杯/nyoj 737 合并石子 区间dp+平行四边形优化
- POJ 1160 (区间DP+四边形优化)
- POJ 1160 普通区间DP||四边形优化DP
- NYOJ 737 石子合并(一) (区间DP+平行四边形优化)
- NYOJ 737 石子合并(一)(区间DP、平行四边形优化、GarsiaWachs算法)
- “玲珑杯”ACM比赛 Round #21-A- 西方制度 (区间DP+平行四边形优化)
- Minimal search cost DP+平行四边形优化
- 平行四边形优化
- hdu 3506Monkey Party(环形DP+平行四边形优化)
- poj 1160 Post Office (区间DP)
- poj 3056 区间dp
- poj 2955 区间DP
- Poj 3377 区间DP
- POJ 1651区间DP
- poj 2955(区间DP)
- POJ 2955 区间dp
- poj 1651 区间DP
- Linux如何创建用户并配置FTP权限
- QTreeWidget
- 已知两点坐标,求直线方程、距离其中一点距离为L的某点
- springmvc 设置默认首页
- [js]02js预解释-作用域-this关键字
- POJ 1160 区间DP + 平行四边形优化
- 四个 block 小技巧
- 新手学Scrapy大坑之win32api及dll load failed
- linux服务器搭建SVN(SUSE SLE_11_SP4)
- 将iOS项目进行子工程化
- spring aop学习
- fetch获取解析json数据
- 新码农与老码农
- iOS10通知框架UserNotifications学习