动态规划求不相邻的最大子数组和

来源:互联网 发布:linux crontab 编辑:程序博客网 时间:2024/04/29 16:42

这个问题原题是这样描述的:

    有N个节点,每两个节点相邻,每个节点只与2个节点相邻,因此,N个顶点有N-1条边。每一条边上都有权值wi,定义节点i到节点i+1的边为wi。
    求:不相邻的权值和最大的边的集合。
对于这个问题可能看起来不是很好处理,把问题更加规范化一些:给出一个数组,求出其中一个子集,使得子集中每个元素在原数组中两两都不相邻并使子集的和最大。

因为不能选择两个相邻的元素,那么对于第i个元素的选择的可能性就包含选择i和不选择i个元素,至于选与不选其实是和第i-1个元素有直接关系的。

考虑两种情况:

1> 选择i,那么第i-1个元素一定不能选

2> 不选择i,那么第i-1个元素是可以选,也可以不选的,这决定于第i-2个元素对i-1的影响。


#include"iostream"#define max(a,b)a>b?a:busing namespace std;main(){int a[100];int i,j,n;int dp[100];cout<<"输入n"<<endl;cin>>n;cout<<"输入n个数"<<endl;for(i=0;i<n;i++){ cin>>a[i];}     dp[1]=max(a[0],a[1]); for(j=1;j<n;j++) { for(i=2;i<=3;i++)//2个数之最多隔2个数,隔3个数是不可能的 {   if(j>=i){  dp[j]=max(dp[j],dp[j-i]+a[j]);}  } dp[j+1]=dp[j]; } cout<<dp[n-1]<<endl;}


原创粉丝点击