NYOJ 737 石子合并(一) (区间DP+平行四边形优化)
来源:互联网 发布:java应用服务器是什么 编辑:程序博客网 时间:2024/04/29 20:33
题目地址:NYOJ 737
定义状态dp [ i ] [ j ]为从第i个石子到第j个石子的合并最小代价。
没有优化的代码如下:耗时248ms。
#include <iostream>#include <string.h>#include <math.h>#include <queue>#include <algorithm>#include <stdlib.h>#include <map>#include <set>#include <stdio.h>using namespace std;#define LL long long#define pi acos(-1.0)//#pragma comment(linker, "/STACK:1024000000")const int mod=1e9+7;const int INF=0x3f3f3f3f;const double eqs=1e-3;const int MAXN=40000+10;int dp[300][300], sum[300];int main(){ int n, i, j, k, len, x; while(scanf("%d",&n)!=EOF) { sum[0]=0; memset(dp,INF,sizeof(dp)); for(i=1; i<=n; i++) { scanf("%d",&x); sum[i]=sum[i-1]+x; dp[i][i]=0; } for(len=2; len<=n; len++) { for(i=1; i<=n-len+1; i++) { j=i+len-1; for(k=i+1; k<=j; k++) { dp[i][j]=min(dp[i][j],dp[i][k-1]+dp[k][j]+sum[j]-sum[i-1]); } } } printf("%d\n",dp[1][n]); } return 0;}
然后这题可以用四边不等式来优化,通过记录s[i][j]的最优分割点为k来将n^3优化成n^2。
优化代码如下:耗时36ms。。。。
#include <iostream>#include <string.h>#include <math.h>#include <queue>#include <algorithm>#include <stdlib.h>#include <map>#include <set>#include <stdio.h>using namespace std;#define LL long long#define pi acos(-1.0)//#pragma comment(linker, "/STACK:1024000000")const int mod=1e9+7;const int INF=0x3f3f3f3f;const double eqs=1e-3;const int MAXN=40000+10;int dp[300][300], sum[300], s[300][300];int main(){ int n, i, j, k, len, x; while(scanf("%d",&n)!=EOF){ sum[0]=0; memset(dp,INF,sizeof(dp)); for(i=1;i<=n;i++){ scanf("%d",&x); sum[i]=sum[i-1]+x; dp[i][i]=0; s[i][i]=i; } for(len=2;len<=n;len++){ for(i=1;i<=n-len+1;i++){ j=i+len-1; for(k=s[i][j-1];k<=s[i+1][j];k++){ if(dp[i][j]>dp[i][k-1]+dp[k][j]+sum[j]-sum[i-1]){ dp[i][j]=dp[i][k-1]+dp[k][j]+sum[j]-sum[i-1]; s[i][j]=k; } } } } printf("%d\n",dp[1][n]); } return 0;}
2 0
- NYOJ 737 石子合并(一) (区间DP+平行四边形优化)
- NYOJ 737 石子合并(一)(区间DP、平行四边形优化、GarsiaWachs算法)
- 蓝桥杯/nyoj 737 合并石子 区间dp+平行四边形优化
- NYOJ 石子合并(一)(区间DP)
- NYOJ题目737石子合并(一)(区间dp)
- NYOJ 737 石子合并(一)(区间dp)
- nyoj 737 石子合并(一)(区间dp)
- nyoj 737 石子合并(一)(区间DP)
- NYOJ 737 — 石子合并(一) 区间dp
- nyoj 737 石子合并(一) 【区间dp】
- nyoj 737 石子合并(一) 区间dp
- NYOJ 737 石子合并(一)(区间dp)
- Nyoj 737: 石子合并(一)(区间DP+四边形优化)
- NYOJ 石子合并(一)(区间dp)
- NYOJ 石子合并(一)经典区间DP
- nyoj 737 合并石子一(dp)
- NYoj - 737 - 石子合并(一)最详细的详解(区间DP入门题)
- NYOJ 石子合并(一)经典区间DP
- NSNumber
- jsgrid 和 grid 两种加easyui的方法
- Xebo-Agent更新
- 二分搜索树,堆,及优先队列
- 黑马程序员——java基础---多线程
- NYOJ 737 石子合并(一) (区间DP+平行四边形优化)
- 导出C/C++API给Lua使用
- BitBlt 画透明位图
- poj 并查集 - 2492 A Bug's Life
- HDU 1425--sort【水题】
- Python读写csv文件
- Error Code: 1630. FUNCTION rand.string does not exist
- 国外程序员整理的 C++ 资源大全
- openstack学习笔记----Nova和 AMQP