POJ1722

问题重述:

给定一个数组a[1,2,..,n] 。定义数组第i位上的减操作:把ai和ai+1换成ai - ai+1。输入一个n位数组以及目标整数t,求一个n-1次操作序列,使得最后剩下的数等于t。

分析:

显然最后剩下的整数是在初始数组中各个元素前添加正负号后相加得到的结果,其中a1的符号必为正,a2必为负。可以通过动态规划确定每个元素的符号。

令dp[i][j]表示从前往后计算到第i个数时结果为j的a[i]前的符号:dp[i][j] = 1表示a[i]取正号;dp[i][j]=-1表示a[i]取负号;dp[i][j] = 0表示当前结果无法取到j。那么假如dp[i-1][j] != 0, 则有dp[i][j + a[i]] = 1, dp[i][j -a[i]] = -1。最后可以通过dp[n][t]倒序计算出每个元素前的符号。

取正号的元素可以看成进行了两次减操作。因此,可以先从左到右对取正号的元素进行一次减操作,再从左到右对每个元素进行减操作即可得到结果。

AC代码

 //Memory: 8364K        Time: 63MS
 #include <iostream>
 #include <cstring>
 #include <cstdio>

 using namespace std;

 ;
 ;
 ;
 int n, t;
 int a[maxn];
 int dp[maxn][maxt];
 int ans[maxn];

 void dynamic()
 {
     memset(dp, , sizeof(dp));
     dp[][a[] + offset] = ;
     dp[][a[] - a[] + offset] = -;
     ; i <= n; i++) {
          + offset; j <=  + offset; j++) {
             ][j] != ) {
                 dp[i][j + a[i]] = ;
                 dp[i][j - a[i]] = -;
             }
         }
     }
 }

 void output()
 {
     memset(ans, , sizeof(ans));
     int s = t + offset;
     ; i--) {
         ans[i] = dp[i][s];
         s -= ans[i] * a[i];
     }
     ;
     ; i <= n; i++) {
         ) {
             printf();
             cnt++;
         }
     }
     ; cnt++)
         printf("1\n");
 }

 int main()
 {
     scanf("%d%d", &n, &t);
     ; i <= n; i++) {
         scanf("%d", &a[i]);
     }
     dynamic();
     output();
     ;
 }

POJ1722 动态规划的更多相关文章

  1. 增强学习(三)----- MDP的动态规划解法

    上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...

  2. 简单动态规划-LeetCode198

    题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...

  3. 动态规划 Dynamic Programming

    March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...

  4. 动态规划之最长公共子序列(LCS)

    转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...

  5. C#动态规划查找两个字符串最大子串

     //动态规划查找两个字符串最大子串         public static string lcs(string word1, string word2)         {            ...

  6. C#递归、动态规划计算斐波那契数列

    //递归         public static long recurFib(int num)         {             if (num < 2)              ...

  7. 动态规划求最长公共子序列(Longest Common Subsequence, LCS)

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  8. 【BZOJ1700】[Usaco2007 Jan]Problem Solving 解题 动态规划

    [BZOJ1700][Usaco2007 Jan]Problem Solving 解题 Description 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地 ...

  9. POJ 1163 The Triangle(简单动态规划)

    http://poj.org/problem?id=1163 The Triangle Time Limit: 1000MS   Memory Limit: 10000K Total Submissi ...

随机推荐

  1. Python番外之 阻塞非阻塞,同步与异步,i/o模型

    1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步:      所谓同步,就 ...

  2. Lintcode--003(乱序字符串)

    给出一个字符串数组S,找到其中所有的乱序字符串(Anagram).如果一个字符串是乱序字符串,那么他存在一个字母集合相同,但顺序不同的字符串也在S中. 注意事项 所有的字符串都只包含小写字母   样例 ...

  3. directive 指令

    参考文章 : http://www.zouyesheng.com/angular.html#toc20    18. 自定义指令directive http://blog.jobbole.com/62 ...

  4. Codeforces 573B Bear and Blocks

    http://codeforces.com/problemset/problem/573/B  题目大意: 给出n个连续塔,每个塔有高度hi,每次取走最外层的块,问需要多少次操作能够拿光所有的块. 思 ...

  5. qmake使用实践:包含动态库的Qt4工程

    文章来源:http://blog.csdn.net/dbzhang800/article/details/6317006 本文是qmake的一个使用练习,是半年前所学的 分析与学习Qt Solutio ...

  6. 代理模式 - OK

    代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式的优点: ...

  7. Linux企业级项目实践之网络爬虫(17)——存储页面

    在爬虫系统中数据的流量相当大,要处理的数据内容不仅包括爬虫系统的各种数据结构空间,而且包括从外部节点中得到的各种数据,比如HTTP请求,HTML页面,ROBOT.TXT等等.如果对这些内容处理不当,那 ...

  8. JVM基础和调优(一)

    最近的项目中,出现了内存和性能的问题,需要优化,所以趁着这个机会,把自己关于java虚拟机的东整理一下,不对的地方,欢迎指出. 数据类型,因为在java的优化的过程中,检测到的数据类型一般比较的基础, ...

  9. Jtree (节点的渲染+资源管理器)

    我们的还是自定义的Jtree的类: package jtree.customNode; import java.io.File; import javax.swing.JTree; import ja ...

  10. tyvj1185营业额统计

    描述 Description 营业额统计  Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况.  Tiger拿出了公司的账本,账本上记录了公司 ...