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 动态规划的更多相关文章
- 增强学习(三)----- MDP的动态规划解法
上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...
- 简单动态规划-LeetCode198
题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...
- 动态规划 Dynamic Programming
March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...
- 动态规划之最长公共子序列(LCS)
转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
- C#动态规划查找两个字符串最大子串
//动态规划查找两个字符串最大子串 public static string lcs(string word1, string word2) { ...
- C#递归、动态规划计算斐波那契数列
//递归 public static long recurFib(int num) { if (num < 2) ...
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- 【BZOJ1700】[Usaco2007 Jan]Problem Solving 解题 动态规划
[BZOJ1700][Usaco2007 Jan]Problem Solving 解题 Description 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地 ...
- POJ 1163 The Triangle(简单动态规划)
http://poj.org/problem?id=1163 The Triangle Time Limit: 1000MS Memory Limit: 10000K Total Submissi ...
随机推荐
- python 解决递归调用栈溢出
递归函数 2578次阅读 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact ...
- substr vs substring
javascript(js)中的 substring和substr方法 Posted on 2009-02-26 14:14 chinaifne 阅读(33698) 评论(0) 编辑 收藏 1.sub ...
- cache buffers chains latch
cache buffers chains latch 从 Oracle 8i Database 开始, 散列锁存器<-------(1:m)------>hash bucket<-- ...
- Android 对话框简介
对话框(Dialog)是程序运行过程中弹出的窗口,Android中有好多种对话框,如警告对话框,进度对话框,列表对话框,单选对话框,日期选择对话框,时间选择对话框等: 下面用几个例子来演示一下各种对话 ...
- ASP.NET文件组成(转载于Owen的BLOG)
一.扩展名: .aspx:窗体文件,为前台程序. .cs文件:类文件,主要为后台数据处理,供所有的.aspx文件的后台应用. .asmx文件:用于创建从其他应用程序使用的web服务的类. .css文件 ...
- phpStorm 各种快捷键
1. ctrl + shift + n: 打开工程中的文件(类似于eclipse中的ctrl+shift+R),目的是打开当前工程下任意目录的文件. 2. ctrl + j: 输出模板 3. ctrl ...
- hdu 4055 Number String(dp)
Problem Description The signature of a permutation is a string that is computed as follows: for each ...
- Python源码学习之初始化(三)-PyDictObject的初始化
先来看它的定义 typedef struct _dictobject PyDictObject; struct _dictobject { PyObject_HEAD Py_ssize_t ma_fi ...
- hdu 5080 2014ACM/ICPC鞍山K题 polya计数
首先,中心点是能够直接算出来的 把全部的坐标相加再除n就能够 然后枚举一个不靠近中心的点,枚举它绕中心点旋转的角度.仅仅要枚举50次就能够了 计算出当前枚举的的角度能否形成一个置换群 计算循环节,再用 ...
- 解决vsftpd 530 Permission denied报错
虚拟机装好RedHat后,准备使用filezilla连接,输入IP地址,root用户,密码,快速连接,报错: 故障排除: 1.首先检查系统是否开启了vsftp服务,如果没有开启,先开启该服务. 方法1 ...