当日总结
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
1.暴力dfs
include
using namespace std;
int n,t;
const int N=10010;
int money[N];
int dfs(int x)
{
if(x>n)return 0;
return max(dfs(x+1),dfs(x+2)+money[x]);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>t;
for(int i=0;i<t;i++)
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>money[i];
}
int res=0;
res=dfs(0);
cout<<res<<endl;
}
return 0;
}
2.记忆化搜索
include
include
include<bits/stdc++.h>
//#include
using namespace std;
int n,t;
const int N=10010;
int money[N];
int mem[N];
int dfs(int x)
{
if(mem[x])return mem[x];
int sum=0;
if(x>n) sum= 0;
else sum= max(dfs(x+1),dfs(x+2)+money[x]);
mem[x]=sum;
return sum;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>t;
for(int i=0;i<t;i++)
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>money[i];
}
int res=0;
memset(mem,0,sizeof mem );
res=dfs(0);
cout<<res<<endl;
}
return 0;
}
3.递推
include
include
//#include<bits/stdc++.h>
include
using namespace std;
int n,t;
const int N=10010;
int money[N];
int f[N];
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>t;
for(int i=0;i<t;i++)
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>money[i];
}
memset(f,0,sizeof f);
for(int i=n-1;i>=0;i--)
{
f[i]=max(f[i+1],f[i+2]+money[i]);
}
cout<<f[0]<<endl;
}
return 0;
}