code jam round 1A 2022 weightlifting 规划练习间的器材摆放顺序
1、分治
2、记忆化
3、动态规划
https://codingcompetitions.withgoogle.com/codejam/round/0000000000877ba5/0000000000aa9280#problem
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #include <bits/stdc++.h> using namespace std; int solve(vector<vector< int >> V) { int N = V.size(), M = V[0].size(); vector<vector< int >> DP(N, vector< int >(N, -1)); //练习i-j的器材添加次数(=取下次数) function< int ( int , int )> solve = [&]( int f, int t) { if (DP[f][t] != -1) return DP[f][t]; if (f == t) { int x = 0; for ( auto v : V[f]) x += v; return DP[f][t] = x; } vector< int > mn(M, INT_MAX); for ( int i = f; i <= t; i++) for ( int j = 0; j < M; j++) mn[j] = min(mn[j], V[i][j]); int bs = 0; for ( int x : mn) bs += x; int mnv = INT_MAX; for ( int i = f; i < t; i++) mnv = min(mnv, solve(f, i) + solve(i + 1, t)); return DP[f][t] = mnv - bs; //第二段可以从bs开始而非0 }; return 2 * solve(0, N - 1); } int main() { int T; scanf ( "%d" , &T); for ( int tc = 1; tc <= T; tc++) { int N, M; scanf ( "%d%d" , &N, &M); vector<vector< int >> V(N, vector< int >(M)); for ( auto &y : V) for ( int &x : y) scanf ( "%d" , &x); printf ( "Case #%d: %d\n" , tc, solve(V)); } } |
题解引用自 HYEA
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人