|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
题目中要求是 一个环中的某些数的和最大,这些数要满足的条件是,不能是相邻的,又因为是一个环,所以首尾两个数也认为是相邻的。这样的话,不妨认为测试数据给出的数组下标是从0~i,第一次先处理A[0]~A[i-1],再处理一次A[1]~A[i],各得出一个最大的,两者较大的即是要求的。处理过程本可以写成一个函数,但是写完懒得改了,就这样吧。
#include <iostream> #include <fstream> #include <vector> #include <string> #include <algorithm> #include <map> #include <stack> #include <cmath> #include <queue> #include <set> #include <list> #include <cctype> #include <stdio.h> #include <stdlib.h> #include <string.h> #define REP(i,j,k) for(int i = j ; i < k ; ++i) #define MAXV (1000) #define INF (0x6FFFFFFF) using namespace std; class BadNeighbors { public: int maxDonations(vector <int> donations) { int ans=0; int dp[50]; bool flag; memset(dp,0,sizeof dp); if(donations.size()==0) return 0; if(donations.size()==1) return donations[0]; if(donations.size()==2) return max(donations[0],donations[1]); REP(i,1,donations.size()) { flag=true; dp[i]=donations[i]; REP(j,1,i-1) { ans=max(dp[j]+donations[i],ans); flag=false; } if(!flag) dp[i]=ans; } int ret=0; memset(dp,0,sizeof dp); dp[0]=donations[0]; REP(i,1,donations.size()-1) { dp[i]=donations[i]; flag=true; REP(j,0,i-1) { ret=max(dp[j]+donations[i],ret); flag=false; } if(!flag) dp[i]=ret; } return max(ans,ret); } }; int main() { //freopen("in.txt","r",stdin); int _x[]= { 11,15 }; vector<int> x(_x,_x+sizeof(_x)/sizeof(_x[0])); BadNeighbors b; printf("%d\n",b.maxDonations(x)); return 0; }