给你一个矩阵,若取其中一个数,则不能取左右相邻的数和上下相邻两行的数,求能取出数字之和的最大值
思路:对于一行来说,相邻的数不可同时取,容易得到状态转移方程:sum[i] = max (sum[i-2]+sum[i], sum[i-1]),其中sum[i]表示一行前i个数时的最大和;然后把sum[m]保存到另一个数组中,对于每一行都这么做,然后最后在对数组再次进行一边这样的操作就行了
#include<iostream>
#define maxn 200005
using namespace std;
int a[maxn],b[maxn];
int main()
{
cin.sync_with_stdio(false);
int n,m;
while(cin>>n>>m&&n&&m)
{
for(int i=0;i<n;i++)
{
cin>>a[0]>>a[1];
a[1]=max(a[0],a[1]);
for(int j=2;j<m;j++)
{
cin>>a[j];
a[j]=max(a[j-1],a[j-2]+a[j]);
}
b[i]=a[m-1];
}
b[1]=max(b[0],b[1]);
for(int i=2;i<n;i++) b[i]=max(b[i-1],b[i-2]+b[i]);
cout<<b[n-1]<<endl;
}
return 0;
}