zoukankan      html  css  js  c++  java
  • 【dp】you are the one

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4283

    题解: 当最优解下, a1在j的位置排出, 则a2 ——aj-1 和 aj——an为两个独立事件, 

      状态转移方程:

     dp[i][i + j] = min(dp[i][i + j], dp[i + 1][i + k] + k *arr[i] + dp[i + k + 1][i + j] +( k + 1) *sum[i + k + 1][i + j]) 做法和取石子类似。
     1 /***Good Luck***/
     2 #define _CRT_SECURE_NO_WARNINGS
     3 #include <iostream>
     4 #include <cstdio>
     5 #include <cstdlib>
     6 #include <cstring>
     7 #include <string>
     8 #include <algorithm>
     9 #include <stack>
    10 #include <map>
    11 #include <queue>
    12 #include <vector>
    13 #include <set>
    14 #include <functional>
    15 #include <cmath>
    16 #include <numeric>
    17 
    18 #define Zero(a) memset(a, 0, sizeof(a))
    19 #define Neg(a)  memset(a, -1, sizeof(a))
    20 #define All(a) a.begin(), a.end()
    21 #define PB push_back
    22 #define inf 0x3f3f3f3f
    23 #define inf2 0x7fffffffffffffff
    24 #define ll long long
    25 using namespace std;
    26 //#pragma comment(linker, "/STACK:102400000,102400000")
    27 void get_val(int &a) {
    28     int value = 0, s = 1;
    29     char c;
    30     while ((c = getchar()) == ' ' || c == '
    ');
    31     if (c == '-') s = -s; else value = c - 48;
    32     while ((c = getchar()) >= '0' && c <= '9')
    33         value = value * 10 + c - 48;
    34     a = s * value;
    35 }
    36 const int maxn = 104;
    37 int arr[maxn];
    38 int n;
    39 int dp[maxn][maxn];
    40 int sum[maxn][maxn];
    41 
    42 int main() {
    43     //freopen("data.out", "w", stdout);
    44     //freopen("data.in", "r", stdin);
    45     //cin.sync_with_stdio(false);
    46     int T;
    47     cin >> T;
    48     for (int ii = 1; ii <= T; ++ii) {
    49         cin >> n;
    50         for (int i = 1; i <= n; ++i) scanf("%d", arr + i);
    51         Zero(dp);
    52         Zero(sum);
    53         for (int i = 1; i <= n; ++i) {
    54             int t = 0;
    55             for (int j = 0; j + i <= n; ++j) {
    56                 t += arr[i + j];
    57                 sum[i][i + j] = t;
    58             }
    59         }
    60         for (int j = 1; j <= n - 1; ++j) {
    61             for (int i = 1; i + j <= n; ++i) {
    62                 dp[i][i + j] = (1 << 31) - 1;
    63                 for (int k = 0; k <= j; ++k) {
    64                     dp[i][i + j] = min(dp[i][i + j], dp[i + 1][i + k] + k *arr[i] + dp[i + k + 1][i + j] +( k + 1) *sum[i + k + 1][i + j]);
    65                 }
    66             }
    67         }
    68         printf("Case #%d: ", ii);
    69         cout << dp[1][n] << endl;
    70     }
    71     return 0;
    72 }
  • 相关阅读:
    Socket网络编程
    android开发常用颜色
    eclipse使用技巧以及开发安卓程序过程中遇到的问题
    XML文件中的常用属性
    将博客园的文本编辑栏属性变成可以粘贴
    显示单位px、dip、pt以及sp
    WIN32 API IP地址转换
    常用win32api函数
    win32—GrafMenu的CreateBitmapIndirect创建失败的问题
    #pragam 使用方法
  • 原文地址:https://www.cnblogs.com/yeahpeng/p/3993433.html
Copyright © 2011-2022 走看看