您的位置:首页 > 其它

动态规划练习一之大盗阿福

2017-04-17 22:08 183 查看
其题意是,一个小偷要投钱,若连续偷两家的钱就会被发现,所以要求不被发现的情况下能得到的最多的钱数。

思路:由于要求钱数最多,且不被发现,就是考虑第i个银行抢不抢的问题,得到状态转移方程为:

b[i]=max(b[i-1],a[i]+b[i-2])

代码:

#include<iostream>
#include<cmath>
using namespace std;
long long int a[100001],b[100001];
int main()
{
long long  int i,j,k,l,m,n,x,y,max1;
cin>>n;
for (k=1;k<=n;k++)
{
cin>>m;
for (i=2;i<=m+1;i++)
{
cin>>a[i];
b[i]=0;
}
b[1]=0;
b[0]=0;
for (i=2,max1=0;i<=m+1;i++)
{
b[i]=max(a[i]+b[i-2],b[i-1]);
if (b[i]>max1)max1=b[i];
}
cout<<max1<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: