- ZigZag - 2003 TCCC Semifinals 3
题意:选出一个序列,满足,相邻两个只差,正负交错,求最长的。
class ZigZag
{
public :
int longestZigZag(vector <int> sequence)
{
int dp[55][2];
cle(dp);
int len=sequence.size();
if(len==1)return 1;
dp[0][1]=1;
dp[0][0]=1;
int i,j,k;
for(i=1;i<len;i++){
for(j=0;j<i;j++){
if(sequence[j]>sequence[i])
{
dp[i][1]=max(dp[i][1],dp[j][0]+1);
}
else if(sequence[j]<sequence[i]){
dp[i][0]=max(dp[i][0],dp[j][1]+1);
}
}
}
int ans=0;
rep(i,len){
ans=max(ans,dp[i][0]);
ans=max(ans,dp[i][1]);
}
cout<<ans<<endl;
return ans;
}
};
- BadNeighbors - 2004 TCCC Round 4
- 题意:围成一个环的一些数,选择一些数,满足不能同时选择相邻的,求最大的和。
class BadNeighbors { public: int maxDonations(vector <int> donations) { int dp[55][2]; int len=donations.size(); int i,j,k; cle(dp); rep(i,len){ dp[i][0]=donations[i]; } dp[0][0]=0; dp[0][1]=donations[0]; rep(i,len) { for(j=0;j<i-1;j++) { if((i+1)%len==j)continue; dp[i][0]=max(dp[i][0],dp[j][0]+donations[i]); dp[i][1]=max(dp[i][1],dp[j][1]+donations[i]); } } int ans=0; rep(i,len){ if(i==len-1) { ans=max(ans,dp[i][0]); break; } ans=max(ans,dp[i][1]); ans=max(ans,dp[i][0]); } return ans; } };
- FlowerGarden - 2004 TCCC Round 1