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 }

 

 

posted on 2013-03-31 01:16  ShellNET  阅读(195)  评论(0)    收藏  举报

导航