SOJ 2440: The days in fzk
问题描述
fzk这几天时而郁闷,时而很high,他开始有点讨厌这样毫无规律的生活了,于是他开始
为将来的日子作计划!
他首先对自己的将来的 n天的心情作了一个预测,但是他对自己的预测也不是很有把握,
fzk说,我最多可能连续R天预测准确,最多可能连续W天预测失误。
fzk希望在自己心情很high的日子里作某些事情,你能够算出他在这n天中最多可能high
多少天么?
输入描述
首先输入测试数据的组数t (1 <= t <= 100),然后每组数据描述如下:
首先是两个整数R和W,其中(1 <= R <= 50, 1 <= W <= 50)
然后是一个代表他对自己的心情的预测的字符串,这个字符串单独成一行,
字符串仅有两种字母构成,G代表心情好,B代表心情很烂,字符串的长度在1到1000之间,包括1和1000
输出描述
对每组输入要求输出一行,这一行仅仅有一个整数构成,表示fzk最多可能很high的天数
输入样例
1
3 2
GBGGGGB
输出样例
6
稍作分析:
依然是简单线性DP。
f[i][j][k]代表在i天时连续j天猜对k猜错时最大的好心情天数,显而易见j与k必然有一个为0,故可以改为f[i][j][0..1],取0时j代表连续的猜对的天数,取1时j代表连续猜错的天数,逐个递推,j为1对错转换,实现很简单(鉴于条件不严,本人丑陋的代码也过掉了),代码如下(未改进):
1 #include <cstdio> 2 #include <cstring> 3 #define INF 0x3f3f3f3f 4 5 int max(int a,int b){ 6 if (a>b)return a; 7 return b; 8 } 9 10 char s[1010]; 11 int f[1001][51][51]; 12 13 int main(){ 14 int index,r,w,n,i,j,k,egs; 15 while(scanf("%d",&index)!=EOF){ 16 while(index--){ 17 scanf("%d %d",&r,&w); 18 scanf("%s",s); 19 n=strlen(s); 20 for (i=0;i<=n;i++) 21 for (j=0;j<=r;j++) 22 for (k=0;k<=w;k++) 23 f[i][j][k]=-INF; 24 f[n-1][1][0]=(s[n-1]=='G'); 25 f[n-1][0][1]=(s[n-1]!='G'); 26 for (i=n-2;i>=0;i--){ 27 if (s[i]=='G'){ 28 f[i][1][0]=0; 29 for (j=1;j<=n-1-i&&j<=w;j++) 30 f[i][1][0]=max(f[i][1][0],f[i+1][0][j]+1); 31 for (j=1;j<=n-1-i&&j<r;j++) 32 f[i][j+1][0]=f[i+1][j][0]+1; 33 34 f[i][0][1]=0; 35 for (j=1;j<=n-1-i&&j<=r;j++) 36 f[i][0][1]=max(f[i][0][1],f[i+1][j][0]); 37 for (j=1;j<=n-1-i&&j<w;j++) 38 f[i][0][j+1]=f[i+1][0][j]; 39 40 } 41 else{ 42 43 f[i][1][0]=0; 44 for (j=1;j<=n-1-i&&j<=w;j++) 45 f[i][1][0]=max(f[i][1][0],f[i+1][0][j]); 46 for (j=1;j<=n-1-i&&j<=r;j++) 47 f[i][j+1][0]=f[i+1][j][0]; 48 49 f[i][0][1]=0; 50 for (j=1;j<=n-1-i&&j<=r;j++) 51 f[i][0][1]=max(f[i][0][1],f[i+1][j][0]+1); 52 for (j=1;j<=n-1-i&&j<=w;j++) 53 f[i][0][j+1]=f[i+1][0][j]+1; 54 55 } 56 } 57 egs=-INF; 58 for (i=1;i<=r;i++) 59 egs=max(egs,f[0][i][0]); 60 for (i=1;i<=w;i++) 61 egs=max(egs,f[0][0][i]); 62 printf("%d\n",egs); 63 } 64 } 65 return 0; 66 }
浙公网安备 33010602011771号