区间dp(poj1651)
2016-06-14 20:47
337 查看
记住就是这样的状态ap【i】【j】!!区间dp欧~
dp【i】【j】表示,把i——j的所有数字都取出的最小代价
枚举k(属于i~j),也就是枚举此刻现在我要取出的第几个数字
然后出转移方程 dp【i】【j】=min(dp【i】【j】,dp【i】【k-1】+dp【k+1】【j】+a【k】*a【i-1】*a【j+1】);
最终答案,dp【2】【n-1】(因为最前面最后面的不选)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int inf=0x3f3f3f3f;
int n,a[109],dp[109][109];
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
for (int i=n-1;i>1;i--)
{
dp[i][i]=a[i]*a[i-1]*a[i+1];
for (int j=i+1;j<n;j++)
{
dp[i][j]=inf;
for (int l=i;l<=j;l++)
dp[i][j]=min(dp[i][j],dp[i][l-1]+dp[l+1][j]+a[l]*a[i-1]*a[j+1]);//转移方程
}
}
printf("%d",dp[2][n-1]);
return 0;
}
总算做了个简单的了
dp【i】【j】表示,把i——j的所有数字都取出的最小代价
枚举k(属于i~j),也就是枚举此刻现在我要取出的第几个数字
然后出转移方程 dp【i】【j】=min(dp【i】【j】,dp【i】【k-1】+dp【k+1】【j】+a【k】*a【i-1】*a【j+1】);
最终答案,dp【2】【n-1】(因为最前面最后面的不选)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int inf=0x3f3f3f3f;
int n,a[109],dp[109][109];
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
for (int i=n-1;i>1;i--)
{
dp[i][i]=a[i]*a[i-1]*a[i+1];
for (int j=i+1;j<n;j++)
{
dp[i][j]=inf;
for (int l=i;l<=j;l++)
dp[i][j]=min(dp[i][j],dp[i][l-1]+dp[l+1][j]+a[l]*a[i-1]*a[j+1]);//转移方程
}
}
printf("%d",dp[2][n-1]);
return 0;
}
总算做了个简单的了
相关文章推荐
- Andrew Ng机器学习之二 单变量线性回归
- 值得Web设计师收藏的20套免费图标素材
- Python类的特点 (1):构造函数与方法
- mybatis缓存机制详解(一)——Cache
- 深度学习中大数据整理问题
- 文本特征选择
- OC语言: Block底层实现原理
- leetcode rotate image
- 【十四】排序函数 模板
- 阅读程序
- python学习—保存网页到本地 html及pdf
- hihocoder #1095 二分
- Tomcat的测试页打开空白页的解决方法
- Hadoop源码分析(1):HDFS读写过程解析
- mysql启动问题access denied for user 'root'@'localhost'(using password:YES)
- mybatis入门教程(九)------mybatis缓存
- Java多种方式自定义序列化
- C#递归生成XML文件,递归序列化对象
- 【LeetCode】122. Best Time to Buy and Sell Stock II
- HDOJ 2005 第几天?