大概关键在于处理第一个与第n个的关系。。
然而我一开始想用dfs 结果不会。。
看了别人的代码,有两种方式处理环
http://www.cnblogs.com/luomi/p/5943882.html
#include<bits/stdc++.h>
using namespace std;
#define sf scanf
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a));
#define N 1005
#define bug1 printf("bug1\n");
#define inf 0x3f3f3f3f
int a[N];
int dp[N][2];
int nofirst[N][2];
int n;
int main(){
int T;
int cas=0;
sf("%d",&T);
while(T--){
mem(dp,-1);
sf("%d",&n);
int maxx=0;
for(int i=1;i<=n;++i){
sf("%d",&a[i]);
maxx=max(maxx,a[i]);
}
mem(dp,0);
dp[2][0]=a[1];
for(int i=3;i<=n;++i){
dp[i][0]=max(dp[i][0],max(dp[i-1][1],dp[i-1][0]));
if(i==n)break;
dp[i][1]=max(dp[i][1],dp[i-1][0]+a[i]);
maxx=max(maxx,max(dp[i][0],dp[i][1]));
}
mem(dp,0);
dp[2][1]=a[2];
for(int i=3;i<=n;++i){
dp[i][0]=max(dp[i][0],max(dp[i-1][1],dp[i-1][0]));
dp[i][1]=max(dp[i][1],dp[i-1][0]+a[i]);
maxx=max(maxx,max(dp[i][0],dp[i][1]));
}
pf("Case %d: %d\n",++cas,maxx);
}
}
http://www.cnblogs.com/zzuli2sjy/p/5503451.html
#include<bits/stdc++.h>
using namespace std;
#define sf scanf
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a));
#define N 1005
#define bug1 printf("bug1\n");
int a[N];
int dp[N];
int nofirst[N][2];
int n;
int main(){
int T;
int cas=0;
sf("%d",&T);
while(T--){
mem(dp,-1);
sf("%d",&n);
for(int i=1;i<=n;++i){
sf("%d",&a[i]);
}
int maxx=a[1];
dp[0]=0;
dp[1]=a[1];
for(int i=2;i<=n-1;++i){//这里n-1就表示不取第n个,,
for(int j=0;j<=i-2;++j){
dp[i]=max(dp[i],dp[j]+a[i]);//把
}
dp[i]=max(dp[i],dp[i-1]);
maxx=max(maxx,dp[i]);
}
mem(dp,0);
dp[n]=a[n];
dp[n+1]=0;
maxx=max(maxx,a[n]);
for(int i=n-1;i>=2;i--){//同上,
for(int j=n+1;j>=i+2;j--){
dp[i]=max(dp[i],dp[j]+a[i]);
}
dp[i]=max(dp[i],dp[i+1]);
maxx=max(maxx,dp[i]);
}
pf("Case %d: %d\n",++cas,maxx);
}
}
本文探讨了经典的环形房屋打劫问题,并提供了两种不同的动态规划解决方案。通过避免同时选取第一个和最后一个房间来解决环形依赖问题,确保了最优解。代码示例使用 C++ 实现。

被折叠的 条评论
为什么被折叠?



