码迷,mamicode.com
首页 > 编程语言 > 详细

DP算法学习

时间:2016-05-16 14:19:07      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

遇到好多问题都在说DPDPDP啊啊啊,好苦恼自己多看看。无非分三步一步一步熟悉就好啦!

原文:http://blog.sina.com.cn/s/blog_50eaa92f0100c8t7.html

动态规划算法的有效性依赖于待求解问题本身具有的两个重要性质:最优子结构性质和子问题重叠性质。

1、最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。

2、子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的解题效率。

当我们已经确定待解决的问题需要用动态规划算法求解时,通常可以按照以下步骤设计动态规划算法:

1、分析问题的最优解,找出最优解的性质,并刻画其结构特征;

2、递归地定义最优值;(方便提高逻辑性和节省时间)

3、采用自底向上的方式计算问题的最优值;(自底而上能够大大减少不必要的重复和提高效率节省时间)

4、根据计算最优值时得到的信息,构造最优解。

1~3步是动态规划算法解决问题的基本步骤,在只需要计算最优值的问题中,完成这三个基本步骤就可以了。如果问题需要构造最优解,还要执行第4步;此时,在第3步通常需要记录更多的信息,以便在步骤4中,有足够的信息快速地构造出最优解。

记下DP第一题:hdu1003

 

 

http://acm.hdu.edu.cn/showproblem.php?pid=1003

代码:

#include<stdio.h>
int a[100010];
int dp[100010];
int main()
{
int n,i,t;
int qq=1;
scanf("%d",&t);
while(t--)
{
int start,end,maxu,j1,j2;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
dp[0]=a[0];
j1=j2=start=end=0;
maxu=-100000;
for(i=0;i<n;i++)
{
if(dp[i-1]+a[i]>=a[i])
{
dp[i]=dp[i-1]+a[i];
end=i;
}
else
{
dp[i]=a[i];
start=i;
end=i;
}
if(maxu<dp[i])
{
maxu=dp[i];
j1=start;
j2=end;
}
}
printf("Case %d:\n",qq++);
printf("%d %d %d\n",maxu,j1+1,j2+1);
if(t!=0)
printf("\n");

}
}

DP算法学习

标签:

原文地址:http://www.cnblogs.com/kobeshegu/p/kobeshegu.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!