GCJ Round 1C 2009 Problem C. Bribe the Prisoners
2016-03-17 11:29
316 查看
区间DP。dp[i][j]表示第i到第j个全部释放最小费用。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int INF=0x7FFFFFFF; const int maxn=100+10; int T,P,Q; int a[maxn]; int dp[maxn][maxn]; void read() { scanf("%d%d",&P,&Q); for(int i=1;i<=Q;i++) scanf("%d",&a[i]); sort(a+1,a+1+Q); a[0]=0; a[Q+1]=P+1; } void init() { memset(dp,0,sizeof dp); for(int i=1;i<=Q;i++) for(int j=i;j<=Q;j++) dp[i][j]=INF; } void work() { for(int i=1;i<=Q;i++) { for(int j=1;j<=Q;j++) { int st=j,en=st+i-1; if(en>Q) continue; if(i==1) { dp[st][en]=a[st]-a[st-1]-1+a[st+1]-a[st]-1; continue; } for(int k=st;k<=en;k++) { dp[st][en]=min( dp[st][en], dp[st][k-1]+dp[k+1][en]+(a[en+1]-1-a[st-1])-1 ); } } } printf("%d\n",dp[1][Q]); } int main() { // freopen("D:\\test.in","r",stdin); // freopen("D:\\test.out","w",stdout); scanf("%d",&T); for(int Case=1;Case<=T;Case++) { read(); init(); printf("Case #%d: ",Case); work(); } return 0; }
相关文章推荐
- Symfony2学习笔记之插件格式分析
- 设计模式- 策略模式
- 曲线抽稀方法罗列
- 多线程中的sleep()
- Windows使用Hexo + Github Pages搭建自己的博客
- 【Browser】浏览器横屏时程序崩溃
- java所有类型的参数传递都是“值传递”
- Rails中使用geometry格式的数据
- Elasticsearch资料
- JavaEE 学习笔记
- 常用的几个开源 API网关管理系统
- android 5.1 kernel 编译模块
- Java day05 单例设计模式
- Android TextView中显示图片的4种方式
- Java读书笔记二(封装类)
- python ——使字典按添加顺序输出
- IntelliJ IDEA 15在线激活码
- Android 手势锁
- js中apply使用方法小议
- Hibernate之Hibernate+EHCache配置二级缓存实战