社区讨论
DFS #4 TLE 求调
P1043[NOIP 2003 普及组] 数字游戏参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhjtv0g3
- 此快照首次捕获于
- 2025/11/04 08:25 4 个月前
- 此快照最后确认于
- 2025/11/04 08:25 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e2 + 10;
const ll inf = 0x3f3f3f3f3f3f3f3f;
ll n, m, siz, res, res2 = inf;
ll f[N];
unordered_map<ll, ll> dp1[N][N][15], dp[N][N][15];
ll dfs(int srt, int dep, int cho, ll lst, ll res)
{
if (dp[srt][dep][cho].count(lst * 3 + res * 5))
return dp[srt][dep][cho][lst * 3 + res * 5];
if (cho == m && dep - srt == n - 1)
{
return dp[srt][dep][cho][lst * 3 + res * 5] = res * ((10 + lst % 10) % 10);
}
ll ans = 0;
if (dep - srt < n)
{
if (cho < m)
ans = max(ans, dfs(srt, dep + 1, cho + 1, f[dep], res * ((10 + lst % 10) % 10)));
ans = max(ans, dfs(srt, dep + 1, cho, lst + f[dep], res));
}
return dp[srt][dep][cho][lst * 3 + res * 5] = ans;
}
ll dfs2(int srt, int dep, int cho, ll lst, ll res)
{
if (dp1[srt][dep][cho].count(lst * 3 + res * 5))
return dp1[srt][dep][cho][lst * 3 + res * 5];
if (cho == m && dep - srt == n - 1)
{
return dp1[srt][dep][cho][lst * 3 + res * 5] = res * ((10 + lst % 10) % 10);
}
ll ans = inf;
if (dep - srt < n)
{
if (cho < m)
ans = min(ans, dfs2(srt, dep + 1, cho + 1, f[dep], res * ((10 + lst % 10) % 10)));
ans = min(ans, dfs2(srt, dep + 1, cho, lst + f[dep], res));
}
return dp1[srt][dep][cho][lst * 3 + res * 5] = ans;
}
void solve()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> f[i];
f[i + n] = f[i];
}
for (int i = 1; i <= n; i++)
{
res = max(res, dfs(i + 1, i + 1, 1, f[i], 1));
res2 = min(res2, dfs2(i + 1, i + 1, 1, f[i], 1));
}
cout << res2 << "\n"
<< res;
}
int main()
{
#ifdef LOCAL
freopen("/Users/hukeren/Code/CppPrograms/洛谷/test/in.txt", "r", stdin);
freopen("/Users/hukeren/Code/CppPrograms/洛谷/test/out.txt", "w", stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
solve();
#ifdef LOCAL
fclose(stdin);
fclose(stdout);
#endif
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...