zoukankan      html  css  js  c++  java
  • cdoj 1131 男神的礼物 区间dp

    题目链接

    给n个数字, 拿走两个数字a, b会有a*b的代价, 并新生成一个数字(a+b)%100, 求拿走所有数字所需的最小代价。

    区间dp, 枚举分界点, 然后记忆化搜索。

     1 #include <iostream>
     2 #include <vector>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <algorithm>
     6 #include <cmath>
     7 #include <map>
     8 #include <set>
     9 #include <string>
    10 #include <queue>
    11 #include <stack>
    12 #include <bitset>
    13 using namespace std;
    14 #define pb(x) push_back(x)
    15 #define ll long long
    16 #define mk(x, y) make_pair(x, y)
    17 #define lson l, m, rt<<1
    18 #define mem(a) memset(a, 0, sizeof(a))
    19 #define rson m+1, r, rt<<1|1
    20 #define mem1(a) memset(a, -1, sizeof(a))
    21 #define mem2(a) memset(a, 0x3f, sizeof(a))
    22 #define rep(i, n, a) for(int i = a; i<n; i++)
    23 #define fi first
    24 #define se second
    25 typedef pair<int, int> pll;
    26 const double PI = acos(-1.0);
    27 const double eps = 1e-8;
    28 const int mod = 1e9+7;
    29 const int inf = 1061109567;
    30 const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
    31 int dp[105][105], a[105], sum[105];
    32 int dfs(int l, int r) {
    33     if(~dp[l][r])
    34         return dp[l][r];
    35     if(l>=r)
    36         return 0;
    37     if(r-l==1)
    38         return a[l]*a[r];
    39     dp[l][r] = inf;
    40     for(int i = l; i<=r; i++) {
    41         dp[l][r] = min(dp[l][r], ((sum[i]-sum[l-1])%100)*((sum[r]-sum[i])%100)+dfs(l, i)+dfs(i+1, r));
    42     }
    43     return dp[l][r];
    44 }
    45 int main()
    46 {
    47     ios::sync_with_stdio(0);
    48     int t, n;
    49     cin>>t;
    50     while(t--) {
    51         cin>>n;
    52         mem1(dp);
    53         for(int i = 1; i<=n; i++) {
    54             cin>>a[i];
    55             sum[i] = sum[i-1]+a[i];
    56         }
    57         int ans = dfs(1, n);
    58         cout<<ans<<endl;
    59     }
    60     return 0;
    61 }
  • 相关阅读:
    CF 436D 最小生成树
    HDU 1847 博弈
    ZOJ 3666 博弈 SG函数
    zoj3675 BFS+状态压缩
    HDU 4734 F(x) 数位DP
    HDU 3709 Balanced Number 数位DP
    HDU 3555 数位DP
    HDU 4336 Card Collector
    HDU4340 Capturing a country DP
    CF 351A
  • 原文地址:https://www.cnblogs.com/yohaha/p/5078222.html
Copyright © 2011-2022 走看看