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