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

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

  1. 有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:b
using 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;



}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值