状态
dp [ i ]表示以偷到i之前(包括 i,但不一定偷 i)的最大的钱数
状态转移方程
dp[i] = max(dp[i-1], dp[i-2] + value[i] );
注意边界条件
#include <iostream>
#include <memory.h>
#include <string>
#include <stdio.h>
using namespace std;
int t;
int n;
int dp[100005];
int value[100005];
int main()
{
cin >> t;;
while( t-- )
{
cin >> n;
memset(dp, 0, sizeof(dp));
memset(value, 0, sizeof(value));
for( int i = 1; i <= n; i++ )
scanf("%d", &value[i]);
dp[1] = value[1];dp[2] = max(value[1],value[2]);
for( int i = 3; i <= n; i++ )
{
dp[i] = max(dp[i-1], dp[i-2] + value[i] );
}
int ans = 0;
for( int i = 1; i <= n; i++)
ans = max(ans, dp[i]);
cout << ans << endl;
}
return 0;
}