DP HDOJ 5492 Find a path

我不是女神ヾ 2021-12-23 09:17 272阅读 0赞

题目传送门

题意:从(1, 1)走到(n, m),每次往右或往下走,问(N+M−1)∑(Ai−Aavg)2 的最小值

分析:展开式子得到(N+M−1)∑(Ai2) - (∑(Ai))2的最小值。用普通的搜索要不超时要不爆内存,用dp。注意到和的值很小,最多59*30,所以dp[i][j][k]表示当走到(i, j)点时和为k的最小的平方和,两个方向转移。

  1. /************************************************
  2. * Author :Running_Time
  3. * Created Time :2015/9/28 星期一 08:16:33
  4. * File Name :I.cpp
  5. ************************************************/
  6. #include <cstdio>
  7. #include <algorithm>
  8. #include <iostream>
  9. #include <sstream>
  10. #include <cstring>
  11. #include <cmath>
  12. #include <string>
  13. #include <vector>
  14. #include <queue>
  15. #include <deque>
  16. #include <stack>
  17. #include <list>
  18. #include <map>
  19. #include <set>
  20. #include <bitset>
  21. #include <cstdlib>
  22. #include <ctime>
  23. using namespace std;
  24. #define lson l, mid, rt << 1
  25. #define rson mid + 1, r, rt << 1 | 1
  26. typedef long long ll;
  27. const int N = 33;
  28. const int INF = 0x3f3f3f3f;
  29. const int MOD = 1e9 + 7;
  30. const double EPS = 1e-8;
  31. int dp[N][N][N*2*N];
  32. int a[N][N];
  33. int main(void) {
  34. int T, cas = 0; scanf ("%d", &T);
  35. while (T--) {
  36. int n, m; scanf ("%d%d", &n, &m);
  37. for (int i=1; i<=n; ++i) {
  38. for (int j=1; j<=m; ++j) {
  39. scanf ("%d", &a[i][j]);
  40. }
  41. }
  42. int S = 59 * 30;
  43. memset (dp, INF, sizeof (dp));
  44. dp[1][1][a[1][1]] = a[1][1] * a[1][1];
  45. for (int i=1; i<=n; ++i) {
  46. for (int j=1; j<=m; ++j) {
  47. for (int k=0; k<=S; ++k) {
  48. int &u = dp[i][j][k];
  49. if (u == INF) continue;
  50. if (i + 1 <= n) {
  51. int &v = dp[i+1][j][k+a[i+1][j]];
  52. v = min (v, u + a[i+1][j] * a[i+1][j]);
  53. }
  54. if (j + 1 <= m) {
  55. int &v = dp[i][j+1][k+a[i][j+1]];
  56. v = min (v, u + a[i][j+1] * a[i][j+1]);
  57. }
  58. }
  59. }
  60. }
  61. int ans = INF;
  62. for (int i=0; i<=S; ++i) {
  63. if (dp[n][m][i] == INF) continue;
  64. ans = min (ans, (n + m - 1) * dp[n][m][i] - i * i);
  65. }
  66. printf ("Case #%d: %d\n", ++cas, ans);
  67. }
  68. return 0;
  69. }

  

转载于:https://www.cnblogs.com/Running-Time/p/4848935.html

发表评论

表情:
评论列表 (有 0 条评论,272人围观)

还没有评论,来说两句吧...

相关阅读

    相关 hdu5492

    hdu5492 > 陈大哥的毒瘤题T1 题意: > 差不多就是根据题意推式子,求最小方差。 解法: > 首先,可以观察到,如果我们直接暴力去取平均...

    相关 hdoj3709(数位dp

    题目链接:https://vjudge.net/problem/HDU-3709 题意:求出\[l,r\]中的平衡数,平衡数即存在一个中心点使得两边的力矩和相等。 思路:首