有一只乌龟,初始在0的位置向右跑。

这只乌龟会依次接到一串指令,指令T表示向后转,指令F表示向前移动一个单位。乌龟不能忽视任何指令。
现在我们要修改其中正好n个指令(一个指令可以被改多次,一次修改定义为把某一个T变成F或把某一个F变成T)。
求这只乌龟在结束的时候离起点的最远距离。(假设乌龟最后的位置为x,我们想要abs(x)最大,输出最大的abs(x))
 
 
 
特判掉$n$过大的情况, 然后由贪心可以知道每个位置最多翻转一次.
设$dp[0/1][i][j][k]$表示第i步翻转j次是否能达位置k且朝向为0/1.
用$bitset$优化转移即可.
#include <iostream>
#include <sstream>
#include <algorithm>
#include <cstdio>
#include <math.h>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <string.h>
#include <bitset>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define hr putchar(10)
#define pb push_back
#define lc (o<<1)
#define rc (lc|1)
#define mid ((l+r)>>1)
#define ls lc,l,mid
#define rs rc,mid+1,r
#define x first
#define y second
#define io std::ios::sync_with_stdio(false)
#define endl '\n'
#define DB(a) ({REP(__i,1,n) cout<<a[__i]<<' ';hr;})
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int P = 1e9+7, P2 = 998244353, INF = 0x3f3f3f3f;
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
ll qpow(ll a,ll n) {ll r=1%P;for (a%=P;n;a=a*a%P,n>>=1)if(n&1)r=r*a%P;return r;}
ll inv(ll x){return x<=1?1:inv(P%x)*(P-P/x)%P;}
inline int rd() {int x=0;char p=getchar();while(p<'0'||p>'9')p=getchar();while(p>='0'&&p<='9')x=x*10+p-'0',p=getchar();return x;}
//head const int N = 110;
int n, m;
char s[N];
bitset<2*N+10> f[2][N][55]; int main() {
scanf("%s%d", s+1, &n);
m = strlen(s+1);
int cnt = 0;
REP(i,1,m) cnt += s[i]=='T';
if (n>=cnt) return printf("%d\n",m-(n>cnt)),0;
f[0][0][0].set(N);
REP(i,1,m) REP(j,0,n) {
if (s[i]=='F') {
f[0][i][j] |= f[0][i-1][j]<<1;
f[1][i][j] |= f[1][i-1][j]>>1;
if (j) {
f[0][i][j] |= f[1][i-1][j-1];
f[1][i][j] |= f[0][i-1][j-1];
}
}
else {
f[0][i][j] |= f[1][i-1][j];
f[1][i][j] |= f[0][i-1][j];
if (j) {
f[0][i][j] |= f[0][i-1][j-1]<<1;
f[1][i][j] |= f[1][i-1][j-1]>>1;
}
}
}
int ans = 0;
REP(i,-m,m) if (f[0][m][n][i+N]||f[1][m][n][i+N]) ans = max(ans, abs(i));
printf("%d\n", ans);
}

最新文章

  1. HTTPS简述
  2. socket编程进阶
  3. libj 0.8.2 发布,Java/JavaScript API 的 C++ 实现
  4. Hadoop 面试题之storm 3个
  5. Intel 80x86 Linux Kernel Interrupt(中断)、Interrupt Priority、Interrupt nesting、Prohibit Things Whthin CPU In The Interrupt Off State
  6. 关于iframe嵌套、动态获取iframe内的url、父页面重定向
  7. MVC 初始 Log4net (一)
  8. Stopwatch 类【转】
  9. OpenStack Dashboard
  10. PAT 团体程序设计天梯赛-练习集 L1-008. 求整数段和
  11. RazorPage 小测试,作下记录
  12. Java_图片切片
  13. 使用TPC-DS工具生成数据
  14. html之多行文本textarea 及下拉框select(12)
  15. java 处理上传exl数据 并导入数据库
  16. Gaussian discriminant analysis 高斯判别分析
  17. maven初级
  18. Java 文件路径相关
  19. bootstrap中给表格设置display之后表格宽度变小问题解决
  20. Spring Security使用心得

热门文章

  1. moveDown()
  2. Java后端开发规范
  3. Nginx之进程间的通信机制(共享内存、原子操作)
  4. android studio最新版的安装和配置(3.1.2)
  5. [java]取当前平台默认字符集,取字符串长度
  6. DataFactory生产手机号码
  7. 一次galera cluster集群故障节点无法启动问题排查
  8. gitlib的安装
  9. SQL:目录
  10. PCL中有哪些可用的PointT类型(1)