纪中的|{题解}[jzoj3853]【NOIP2014八校联考第2场第2试9.28】帮助Bsny(help)
传送门
Analysis
怎么看都是DP
1≤h[i]?24≤8提示我们可以 状态压缩 高度范围
可以发现 选择移动一本书 对答案的贡献只有
1. 他本身的离开使原先不相邻者相邻
2. 它移动到”团体”中去后 不再”混乱”
于是 对于任意一本书 我们考虑往左移动 或往右移动 或不动
对于左移 考虑左边的书可能已经被移走 所以状压左边高度范围
对于右移 考虑右边有等高的书籍 预处理数组表示是否存在
Q: 右边的书移走了怎么办?
A: 麻烦自己手推一个样例。
【纪中的|{题解}[jzoj3853]【NOIP2014八校联考第2场第2试9.28】帮助Bsny(help)】 ∴设F[i][j][k][o]表示前i本抽出j本剩余的书最后一本为k高度状态为o的最小混乱值
可以考虑更改搜索顺序优化常数blablabla
Code
#include
#include
#include
#include
#define oo 2139062143
using namespace std;
const int N = 110, K = 110, NUM = 8 + 4,All = (1 << 8) - 1;
int n,m;
int a[N],tot;
struct node{
int a,b;
}e[N];
bool aft[N],found[NUM];
int f[N][N][All + 1][NUM];
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1;
i <= n;
i ++) scanf("%d", &a[i]), a[i] -= 25;
a[0] = -1;
for (int i = 1;
i <= n;
i ++)
{
if (a[i] != a[i - 1])
e[++ tot].a = a[i],e[tot].b = 1;
else e[tot].b ++;
}
for (int i = tot;
i >= 1;
i --)
aft[i] = found[e[i].a],found[e[i].a] = true;
memset(f,127,sizeof(f));
//f[i][j][l][k] = 前i本 抽出j本 l表示前i本存在高度状态 最后一本为k
f[0][0][0][8] = 0;
for (int i = 0;
i <= tot - 1;
i ++)
for (int j = 0;
j <= m;
j ++)
for(int l = 0;
l <= All;
l ++)
for (int k = 0;
k <= 8;
k ++)
if (f[i][j][l][k] < oo)
{
int t = e[i + 1].a;
f[i + 1][j][l | (1 << t)][t] = min(f[i + 1][j][l | (1 << t)][t],(t == k)?(f[i][j][l][k]):(f[i][j][l][k] + 1));
if (j + e[i + 1].b <= m)
{
f[i + 1][j + e[i + 1].b][l | (1 << t)][k] = min(f[i + 1][j + e[i + 1].b][l | (1 << t)][k],f[i][j][l][k] + 1);
if ((l & (1 << t)) > 0) f[i + 1][j + e[i + 1].b][l][k] = min(f[i + 1][j + e[i + 1].b][l][k],f[i][j][l][k]);
if (aft[i + 1]) f[i + 1][j + e[i + 1].b][l][k] = min(f[i + 1][j + e[i + 1].b][l][k],f[i][j][l][k]);
}
}int ans = oo;
for (int i = 0;
i <= m;
i ++)
for (int j = 0;
j <= All;
j ++)
for (int l = 0;
l <= 7;
l ++)
ans = min(ans,f[tot][i][j][l]);
printf("%d", ans);
}
推荐阅读
- 热闹中的孤独
- JS中的各种宽高度定义及其应用
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- Android中的AES加密-下
- 放下心中的偶像包袱吧
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- C语言浮点函数中的modf和fmod详解
- C语言中的时间函数clock()和time()你都了解吗
- 如何在Mac中的文件选择框中打开系统隐藏文件夹