标签:dp
2 6 1 2 2 1 3 3 22 1 7 1 2 4 2 4 9 1 1 9 4 5 9 4 5 6 9 2 1 2 9
3 6
题意:有n个人围着卓,所有人都要成对敬酒,且不能有交差的,求最多有多少对成对敬酒。
题解:要所有可能成对且不交差,那么区间内一定是偶数个人。
#include<stdio.h> #include<string.h> int dp[2005][2005]; int max(int a,int b) { return a>b?a:b; } int main() { int t,n,ans[2005]; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&ans[i]); } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dp[i][j]=0; for(int r=1;r<n;r+=2)//保证区间人数为偶数,只有是偶数才能所有人成对敬酒 for(int i=1;i<=n-r;i++) { int j=i+r; dp[i][j]=dp[i+1][j-1];//如果在区间内没有与i成对时 for(int k=i+1;k<=j;k+=2)//保持小区间也成偶数 if(ans[i]==ans[k]) dp[i][j]=max(dp[i][j],dp[i+1][k-1]+1+dp[k+1][j]); else dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]); } printf("%d\n",dp[1][n]); } }
poj3056The Bavarian Beer Party (不交差配对,区间DP)
标签:dp
原文地址:http://blog.csdn.net/u010372095/article/details/38010477