赞 | 12 |
VIP | 107 |
好人卡 | 6 |
积分 | 4 |
经验 | 31122 |
最后登录 | 2023-11-26 |
在线时间 | 1605 小时 |
Lv2.观梦者 傻♂逼
- 梦石
- 0
- 星屑
- 369
- 在线时间
- 1605 小时
- 注册时间
- 2007-3-13
- 帖子
- 6562
|
随便写写懒的优化了
- #include <cstdio>
- #include <algorithm>
- #include <queue>
- using namespace std;
- // 0 water 1 veg
- int dp[9][(1<<9)][1<<9];
- bool checkok(int now, int upper, int upper1) {
- if (upper & 1){
- if ((now & 1) && (upper1 & 1) && ((upper >> 1) & 1))
- return false;
- }
- if ((upper >> 8) & 1){
- if (((now>>8) & 1) && ((upper1>>8) & 1) && ((upper >> 7) & 1))
- return false;
- }
- for (int i = 1; i < 8; i++) {
- if ((upper >> i) & 1) {
- if ( ((upper >> (i - 1))&1) && ((upper >> (i + 1))&1) && ((now >> (i))&1) && ((upper1 >> (i))&1)) {
- return false;
- }
- }
- }
- return true;
- }
- int count1(int x){
- int cnt = 0;
- while (x){
- cnt+=x&1;
- x >>= 1;
- }
- return cnt;
- }
- int main(){
- for (int i = 0; i < (1<<9); i++){
- dp[0][i][(1 << 9) - 1] = count1(i);
- }
- for (int i = 1; i < 9; i++){
- for (int now = 0; now < (1<<9); now++){
- for (int upper = 0; upper < (1<<9); upper++)
- for (int upper1 = 0; upper1 < (1<<9); upper1++){
- if (checkok(now, upper, upper1)) {
- dp[i][now][upper] = max(dp[i][now][upper], dp[i - 1][upper][upper1] + count1(now));
- }
- }
- }
- }
- int ans = 0;
- for (int upper = 0; upper < (1<<9); upper++) {
- for (int upper1 = 0; upper1 < (1<<9); upper1 ++){
- if (checkok((1<<9) - 1, upper, upper1)) {
- ans = max(ans, dp[8][upper][upper1]);
- }
- }
- }
- printf("%d\n", ans);
- }
复制代码 |
评分
-
查看全部评分
|