您的位置:首页 > 产品设计 > UI/UE

code forces 399B Red&Blue Balls

2014-03-03 21:31 375 查看
code forces   Red&Blue Balls                              题目链接:http://codeforces.com/problemset/problem/399/B我特别想说这像是个记忆化搜索DP,可是看它的难度,也就是个水题打表……

题目大意:有两种球(蓝色Blue和红色Red),一个栈<球>,定义一组操作如下,

(1)while(栈顶的球是红色)pop();

(2)把栈顶的蓝球换成红的;

(3)push(蓝球)至n个;

求这样的操作循环几次后栈内的球全变成红的了。

题目分析:模拟T.L.E,那就找找规律。先来分析一下过程,整个过程大概就是从上到下,把蓝球一个一个变红,过程中可能会遇到把蓝球变红时付出把其上的红球变蓝的代价,所以我断定,递归会和模拟一样T.L E。既然上面的红球还会变蓝,那就说明可能会遇到走过的状态,可以用记忆化搜索的思想来把每个状态的B变成R所需的步骤记下来,甚至可以直接打出表来,输入查找即可。状态转移方程:dp[i]=(求和)dp[j](j=0,1,2,……i-1)+1。我找到的规律其实还不够彻底,其实把表输出来一看是个二进制数……

code:

#include<iostream>
#include<string>
using namespace std;
string s;
__int64 a[55]={1};
int main()
{
__int64 i,j,n,cnt=0;
cin>>n>>s;
for(i=1;i<=50;i++)
{
a[i]=1;
for(j=0;j<i;j++)
{
a[i]+=a[j];
}
}
for(i=0;i<s.size();i++)
{
if(s[i]=='B')cnt+=a[i];
}
cout<<cnt<<endl;
return 0;
}
PS:虽然还是很水,但毕竟是凭一己之力出的……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  找规律