状态机1:1049
作者:
总打瞌睡的天天啊
,
2024-10-16 17:44:54
,
所有人可见
,
阅读 2
//1.之前的分析方式
// 状态表示:f[i]:只抢前i个商店,获得的最大金币
// 状态转移 :抢加不抢
// #include<iostream>
// #include<algorithm>
// #include<cstring>
// using namespace std;
// const int N=1e6+1;
// int f[N],a[N];
// int main()
// {
// int t;
// cin>>t;
// while(t--)
// {
// int n;
// cin>>n;
// for(int i=1;i<=n;i++)
// {
// cin>>a[i];
// f[i]=max(f[i-1],f[i-2]+a[i]);
// }
// cout<<f[n]<<endl;
// }
// }
//2.状态机:把不好表示的状态,一步步分解
//状态表示:f[i][0|1],只抢劫前i个商店,0选择了最后一个商店,1未选择最后一个商代
// 所有走了i步,处于状态j,属性max
//状态表示:f[i][0]=f[i-1][0],f[i-1][1]. f[i][1]=f[i-1][0]+w[i]
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e5+10,INF=0x3f3f3f3f;
int f[N][2];
int a[N];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
f[0][0]=0,f[0][1]=-INF;//1代表抢了,但没有金币,则肯定抢不了钱,因该初始为最小值
for(int i=1;i<=n;i++)
{
f[i][0]=max(f[i-1][0],f[i-1][1]);
f[i][1]=f[i-1][0]+a[i];
}
cout<<max(f[n][0],f[n][1])<<endl;
}
return 0;
}