Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <climits> #include <cstring> #include <string> #include <set> #include <bitset> #include <map> #include <queue> #include <stack> #include <vector> #define rep(i,m,n) for(i=m;i<=n;i++) #define mod 1000000007 #define inf 0x3f3f3f3f #define vi vector<int> #define pb push_back #define mp make_pair #define fi first #define se second #define ll long long #define pi acos(-1.0) #define pii pair<int,int> #define sys system("pause") const int maxn=1e5+10; const int N=1e3+10; using namespace std; ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);} ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p%mod;p=p*p%mod;q>>=1;}return f;} int n,m,k,t,dp[110][110][51],pos[110],cnt,cas,ret; char a[110]; int main() { int i,j; scanf("%d",&cas); while(cas--) { scanf("%d%d",&n,&m); m/=2; ret=cnt=0; scanf("%s",a+1); for(i=1;i<=n;i++)if(a[i]==‘2‘)pos[++cnt]=i; pos[++cnt]=i; memset(dp[0],-1,sizeof(dp[0])); dp[0][0][m]=0; for(i=1;i<=cnt;i++) { for(j=i;j<=n+1;j++) { for(k=0;k<=m;k++) { dp[i][j][k]=-1; for(t=i-1;t<j;t++) { if(k+abs(j-pos[i])<=m&&dp[i-1][t][k+abs(j-pos[i])]!=-1) { dp[i][j][k]=max(dp[i][j][k],dp[i-1][t][k+abs(j-pos[i])]+(j-t>2&&i>1)); } } if(i==cnt&&j==n+1&&ret<dp[i][j][k])ret=dp[i][j][k]; } } } printf("%d\n",ret); } return 0; } /* 1 5 19 33233 ans:1 */
原文:http://www.cnblogs.com/dyzll/p/6443431.html