DP题目的状态表示真的很重要,直接决定了解决这题的时间、空间效率。
#include <bits/stdc++.h>
using namespace std;
long long s[40], t, x, a;
long long dp[40];
long long dfs(long long pos, long long lim)
{
if (pos == 0)
return 1;
if (!lim && dp[pos] != -1)
return dp[pos];
int up = lim ? s[pos] : 1;
long long sum = 0;
for (int i = 0; i <= up; i++)
{
if (i && ((1 << (pos - 1)) & a))
continue;
sum += dfs(pos - 1, lim && i == up);
}
if (!lim)
dp[pos] = sum;
return sum;
}
long long get(long long a, long long x)
{
memset(dp, -1, sizeof dp);
int pos = 0;
while (x)
{
s[++pos] = x % 2;
x /= 2;
}
return dfs(pos, 1);
}
int main()
{
cin >> t;
while (t--)
{
cin >> a >> x;
cout << get(a, x) - 1 << endl;
}
return 0;
}

本文通过一个C++实现的动态规划(DP)题目,展示了如何利用状态表示和二进制搜索优化算法效率。代码中定义了`dfs`函数进行深度优先搜索,并使用`get`函数处理输入,有效地计算出特定条件下的结果。在主函数中,程序读取测试用例并输出解决方案。该文强调了状态表示在DP问题中的关键作用,对于提升时间和空间效率至关重要。
1161

被折叠的 条评论
为什么被折叠?



