这个问题原题是这样描述的:
-
有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;
}