区间dp
2016-04-05 20:53
218 查看
石子合并问题:
在一个操场上摆放着一行共n堆的石子。现要将石子有序地合并成一堆。规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆石子数记为该次合并的得分。请编辑计算出将n堆石子合并成一堆的最小得分和将n堆石子合并成一堆的最大得分。
题目中要求的是只能选相邻的,区间dp;如果是任意两堆直接贪心即可。
一堆石子总是由两堆石子合并而成,哪两堆?-----枚举,区间dp
设dp[I][j]是I到j合成一堆得到的分数,状态转移方程为dp[I][j]=dp[I][k]+dp[k+1][j]+sum(I,j);
环状最小得分代码如下:
这里用了一个小技巧就是把环状转换为链状,只需在原来的数组后面加上一个相同的数组成为一个数组即可;
邮局问题:
有一条公路经过V个村庄,每一个村庄都处在整数的坐标点上(这里假设公路拉直为X轴).规划在这条公路上建立P个邮局,当然为了方便,这些邮局应建在某P个村庄上,没有邮局的到距离村庄最近的邮局,但是要求让不同村庄的人到邮局要走的总路程最小.
每个邮局都有一个影响范围,假设第j-1个邮局影响到第k个村庄,第j个邮局影响范围就是[k+1,i]的村庄,设dp[I][j]是到第I个村庄时已经有了j个邮局的总花费,那么dp[i][j]=min(dp[I][j],dp[k][j-1]+dis(k+1,i)),其中j-1=<k<i;
dis(k+1,j)表示第j个邮局到各个村庄的花费。而一个邮局在一个区间里当然是建在区间的终点时,dis(k+1,i)最小。大致思路应该是这样吧...
在一个操场上摆放着一行共n堆的石子。现要将石子有序地合并成一堆。规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆石子数记为该次合并的得分。请编辑计算出将n堆石子合并成一堆的最小得分和将n堆石子合并成一堆的最大得分。
题目中要求的是只能选相邻的,区间dp;如果是任意两堆直接贪心即可。
一堆石子总是由两堆石子合并而成,哪两堆?-----枚举,区间dp
设dp[I][j]是I到j合成一堆得到的分数,状态转移方程为dp[I][j]=dp[I][k]+dp[k+1][j]+sum(I,j);
环状最小得分代码如下:
#include<stdio.h> #include<stdlib.h> int num[2000]; int dp[1000][2000]; int sum(int i,int j){ int m,s=0; for(m=i;m<=j;m++) s+=num[m]; return s; } int main(){ int n,i,k,len,min,tmp,ans; ans=100000000; scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d",&num[i]); num[n+i]=num[i]; /*将环转换为链,如果是链不需要*/ } for(len=1;len<n;len++){ for(i=0;i<n;i++){ /*链为i+len<n*/ min=100000000; for(k=i;k<i+len;k++){ tmp=dp[i][k]+dp[k+1][i+len]; if(tmp<max) min=tmp; } dp[i][i+len]=min+sum(i,i+len); if(len==n-1){ /*链不需要,只需在最后直接输出dp[0][n-1]*/ if(dp[i][i+len]<ans) ans=dp[i][i+len]; } } } printf("%d\n",ans); return 0; }
这里用了一个小技巧就是把环状转换为链状,只需在原来的数组后面加上一个相同的数组成为一个数组即可;
邮局问题:
有一条公路经过V个村庄,每一个村庄都处在整数的坐标点上(这里假设公路拉直为X轴).规划在这条公路上建立P个邮局,当然为了方便,这些邮局应建在某P个村庄上,没有邮局的到距离村庄最近的邮局,但是要求让不同村庄的人到邮局要走的总路程最小.
每个邮局都有一个影响范围,假设第j-1个邮局影响到第k个村庄,第j个邮局影响范围就是[k+1,i]的村庄,设dp[I][j]是到第I个村庄时已经有了j个邮局的总花费,那么dp[i][j]=min(dp[I][j],dp[k][j-1]+dis(k+1,i)),其中j-1=<k<i;
dis(k+1,j)表示第j个邮局到各个村庄的花费。而一个邮局在一个区间里当然是建在区间的终点时,dis(k+1,i)最小。大致思路应该是这样吧...
相关文章推荐
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- C#使用动态规划解决0-1背包问题实例分析
- 动态规划
- C++ 动态规划
- DP(动态规划) 解游轮费用问题
- 动态规划的用法——01背包问题
- 动态规划的用法——01背包问题
- 《收集苹果》 动态规划入门
- 《DNA比对》蓝桥杯复赛试题
- 《背包问题》 动态规划
- 自顶向下动态规划解决最长公共子序列(LCS)问题
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 关于爬楼梯的动态规划算法
- 动态规划 --- hdu 1003 **
- DP问题各种模型的状态转移方程
- 0-1背包解题过程
- 背包问题
- USACO 3.2.2:Stringsobits
- 字符串编辑距离