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中的model模板中的数据类型

    mode对应的类型 见 : https://docs.djangoproject.com/en/1.8/ref/models/fields/ 命令行ipython查看 from django.db i ...

  2. C程序设计语言练习题1-7

    练习1-7 编写一个打印EOF的值的程序. #include <stdio.h> // 包含标准库的信息. int main() // 定义名为main的函数,它不接受参数值. { // ...

  3. 转载的别人的ajax跨域解决方法

    http://dynamic.vip.xxxxxx.com/active/<controllers>/<active>/<id> 放在浏览器地址栏中访问可以得到正确 ...

  4. 用js实现两个select下拉框之间的元素互相移动

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. gtest以及测试小结

    所有的测试,都是让未知的东西和已知的东西进行比较,如果测试结果和预期的一样,那么就认为被测对象是OK的否则视为有问题. python的单元测试是写一堆继承了unittest.TestCase类,每个类 ...

  6. Eclipse远程调试weblogic

    http://www.cnblogs.com/dyllove98/archive/2013/08/06/3241140.html http://blog.csdn.net/afgasdg/articl ...

  7. usaco5.5-Picture

    离散化计算重叠矩形的周长. 称平行于x轴的边为横边,我们以横边为例,某一矩形中y坐标比较小的横边我们称为始边,另一边我们称为终边.用一条扫描线从下往上扫描,当扫到一条始边的时候,如果这条始边的正下方出 ...

  8. c语言指针与结构体之内存动态分配

    struct dangdangtest { ]; ]; ]; int num; int bugnum; ]; ]; double RMB; }; void main2() { //struct dan ...

  9. Entify Framewrok - LINQ简单使用

    1.如何使用Join: http://www.devcurry.com/2011/01/join-example-in-linq-and-c.html

  10. editplus批量删除html代码空行

    在editplus替换菜单功能里,“查找”功能里输入: ^[ \t]*\n 替换为空,然后“全部替换”即可. 替换时,要选择“正则表达式”选项, 详细:http://www.dedecms8.com/ ...