思路:

题目链接http://poj.openjudge.cn/practice/C17K/

状压dp。dp[i][j]表示第i - k人到第i人的状态为j的情况下前i人中最多有多少好人。

实现:

 #include <bits/stdc++.h>
using namespace std;
int dp[][];
struct node
{
int type, id1, id2;
bool f1, f2;
};
node a[];
bool same(bool a, bool b)
{
return (a && b) || (!a && !b);
}
int main()
{
int t, n, k;
cin >> t;
while (t--)
{
memset(dp, , sizeof dp);
cin >> n >> k;
string s;
getchar();
for (int i = ; i < n; i++)
{
getline(cin, s);
string tmp;
stringstream ss(s);
vector<string> v;
while (ss >> tmp) v.push_back(tmp);
if (v[][] == 'I')
{
a[i].type = ;
a[i].id1 = atoi(v[].c_str());
a[i].id2 = atoi(v[].c_str());
a[i].f1 = v[] == "good" ? true : false;
a[i].f2 = v[] == "good" ? true : false;
}
else
{
a[i].type = ;
a[i].id1 = atoi(v[].c_str());
a[i].f1 = v[] == "good" ? true : false;
}
} int msk = ( << k + ) - ;
dp[][] = ;
for (int i = ; i < n; i++)
{
memset(dp[i & ], , sizeof dp[i & ]);
for (int j = ; j < << k + ; j++)
{
if (i < k + && j >= << i) continue;
int tmp = j << & msk;
dp[i & ][tmp] = max(dp[i & ][tmp], dp[i - & ][j]);
if (a[i].type == )
{
int p1 = i - a[i].id1;
if (same(a[i].f1, j >> p1 & ))
{
dp[i & ][tmp | ] = max(dp[i & ][tmp | ], dp[i - & ][j] + );
}
}
else
{
int p1 = i - a[i].id1, p2 = i - a[i].id2;
bool g1 = j >> p1 & , g2 = j >> p2 & ;
if (!(same(a[i].f1, g1) && !same(a[i].f2, g2)))
dp[i & ][tmp | ] = max(dp[i & ][tmp | ], dp[i - & ][j] + );
}
}
}
int ans = ;
for (int i = ; i < << k + ; i++)
ans = max(ans, dp[n - & ][i]);
cout << ans << endl;
}
return ;
}

最新文章

  1. 怎么样快速学习AngularJS?
  2. Java-Java中System.arraycopy() 和 Arrays.copyOf()两者之间的区别
  3. 分享到QQ空间代码(一)
  4. spark_updateStateByKey
  5. nodejs base64 编码解码
  6. 使用Yii框架中遇到的三个问题
  7. Java验证码和ajax判断
  8. BZOJ 1483 梦幻布丁
  9. (转:亲测)cnblogs博文浏览[推荐、Top、评论、关注、收藏]利器代码片段
  10. linux: Ubuntu安装samba的问题
  11. MYSQL 基础总结
  12. Python----爬虫入门系列等
  13. Python+Selenium+Pycharm
  14. 201771010118马昕璐《面向对象程序设计java》第八周学习总结
  15. logstash报错 :backtrace=&gt;[&quot;org/jruby/RubyIO.java:1457:in `write&#39;&quot;, &quot;org/jruby/RubyIO.java:1428:in `write&#39;&quot;
  16. laravel 不理解的call方法
  17. 基于ALTERA SOPC设计的概述
  18. C++雾中风景11:厘清C++类型转换(static_cast,dynamic_cast,reinterpret_cast,const_cast)
  19. CentOS 7 :Failed to start IPv4 firewall with iptables.
  20. 删除sslvpn用户

热门文章

  1. Linux时间子系统之三:时间的维护者:timekeeper【转】
  2. JAVA 单选样式编写
  3. Oracle:不同数据库版本导致的Ora-00918问题
  4. 每次rand出来都是41?说好的随机数呢?!
  5. I.MX6 android 源码下载
  6. 【CQ18阶梯赛第二场】题解
  7. 【JSOI 2009】 Count
  8. HNOI2008 明明的烦恼 (purfer序列 + 组合数学)
  9. bzoj 4289 TAX —— 点边转化
  10. WIN7开机自动登录设置