vijos 1038 括号+路径 ***

链接:点我

就是自己写不出来

 1 #include <cstdio>
 2 #include <climits>
 3 #include <memory.h>
 4 using namespace std;
 5 const int MAX = 23;
 6
 7 int dp[MAX][MAX];
 8 int pos[MAX][MAX];
 9 int val[MAX], sum[MAX][MAX];
10
11 void print_path(int i, int j){
12     if(i == j){
13         printf("%d", val[i]);
14         return;
15     }
16     printf("(");
17     print_path(i, pos[i][j]);
18     printf("+");
19     print_path(pos[i][j] + 1, j);
20     printf(")");
21 }
22
23 int print_intermedia(int x, int y){
24     if(x == y)return val[x];
25     int v = print_intermedia(x, pos[x][y]) + print_intermedia(pos[x][y] + 1, y);
26     printf("%d ", v);
27     return v;
28 }
29
30 int main(int argc, char const *argv[]){
31     int N;
32     scanf("%d", &N);
33     for(int i = 1; i <= N; ++i){
34         scanf("%d", &val[i]);
35     }
36     memset(sum, -1, sizeof(sum));
37
38     for(int i = 1; i <= N; ++i){
39         dp[i][i] = 0;
40         pos[i][i] = i;
41         sum[i][i]= val[i];
42         for(int j = i + 1; j <= N; ++j){
43             sum[i][j] = sum[i][j - 1] + val[j];
44         }
45     }
46
47     for(int j = 1; j < N; ++j){
48         for(int i = 1; i + j <= N; ++i){
49             int opt_v = INT_MAX, opt_p = 0;
50             for(int k = i + j - 1; k >= i; --k){
51                 if(opt_v > dp[i][k] + dp[k + 1][i + j] + sum[i][i + j]){
52                     opt_v = dp[i][k] + dp[k + 1][i + j] + sum[i][i + j];
53                     opt_p = k;
54                 }
55             }
56             pos[i][i + j] = opt_p;
57             dp[i][i + j] = opt_v;
58         }
59     }
60     print_path(1, N);
61     printf("\n");
62     printf("%d\n", dp[1][N]);
63     print_intermedia(1, N);
64     printf("\n");
65
66     return 0;
67 }
时间: 2024-08-03 22:04:37

vijos 1038 括号+路径 ***的相关文章

Vijos P1448 校门外的树【多解,线段树,树状数组,括号序列法+暴力优化】

校门外的树 描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作: K=1,K=1,读入l.r表示在区间[l,r]中种上一种树,每次操作种的树的种类都不同 K=2,读入l,r表示询问l~r之间能见到多少种树 (l,r>0) 格式 输入格式 第一行n,m表示道路总长为n,共有m个操作 接下来m行为m个操作 输出格式 对于每个k=2输出一个答案 样例1 样例输入1 5 4 1 1

vijos 1071 01背包+输出路径

描述 过年的时候,大人们最喜欢的活动,就是打牌了.xiaomengxian不会打牌,只好坐在一边看着. 这天,正当一群人打牌打得起劲的时候,突然有人喊道:“这副牌少了几张!”众人一数,果然是少了.于是这副牌的主人得意地说:“这是一幅特制的牌,我知道整副牌每一张的重量.只要我们称一下剩下的牌的总重量,就能知道少了哪些牌了.”大家都觉得这个办法不错,于是称出剩下的牌的总重量,开始计算少了哪些牌.由于数据量比较大,过了不久,大家都算得头晕了. 这时,xiaomengxian大声说:“你们看我的吧!”于

POJ 1141-Brackets Sequence(区间dp括号匹配打印路径)

题目地址:POJ 1141 题意:给出一串由'(')'' [ ' ' ] '组成的串,将给出的括号序列以添加最小数目括号的形式进行配对. 思路:dp[i][j]表示当前子序列需要添加的最小字符数,path存储的是所有子问题的解.然后详情看代码解释. #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #in

shell中各种括号的作用

小括号里是命令大括号是变量值   一.小括号,圆括号() 1.单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格. ②命令替换.等同于`cmd`,shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到原来命令.有些shell不支持,如tcsh. ③用于初始化数组.如:array=(a b

C++路径的整理

写C++,路径的问题一直都让人很头疼,抽空整理一些方法:也许以后会用到: 1."./" 加不加都一样,就是指当前目录 2."../" 表示当前目录的上级目录,即当前的父目录. (这里的当前目录就是指.vcxproj和当前运行的.cpp文件所在目录,而不是.sln文件所在目录) 注意:前面两种在工程文件夹里面执行时没有问题的,但是打包成DLL,被调用就行不通了: 3.获取当前执行文件的路径(不包括文件名)--(dll获取自身路径) char path[MAX_PATH

获取当前工程路径

1.利用System.getProperty()函数获取当前路径:System.out.println(System.getProperty("user.dir"));//user.dir指定了当前的路径 2.使用File提供的函数获取当前路径:File directory = new File("");//设定为当前文件夹try{    System.out.println(directory.getCanonicalPath());//获取标准的路径    Sy

Shell 括号辨识(转http://blog.csdn.net/taiyang1987912/article/details/39551385)

一.小括号,圆括号() 1.单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格. ②命令替换.等同于`cmd`,shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到原来命令.有些shell不支持,如tcsh. ③用于初始化数组.如:array=(a b c d) 2.双小括号 (( ))

include查找文件路径

使用<>括号 先在Xcode的编译环境找.路径如下: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include 说明:contents文件夹要选中Xcode,右击鼠标,选择显示包内容才会显示. 上面找不到时,再到mac系统编译环境找.路径如下: /usr/include 说明:1 想要找到该路径首先需要将系统保护文件显示出来(在终

UVa 112 - Tree Summing(树的各路径求和,递归)

题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&page=show_problem&problem=48 Tree Summing  Background LISP was one of the earliest high-level programming languages and, with FORTRAN, is one of the olde