摘要:Description等差数列的定义是一个数列S,它满足了(S[i]-S[i-1]) = d (i> 1)。显然的一个单独的数字或者两个数字也可以形成一个等差数列。 经过一定的学习小C发现这个问题太简单了,等差数列的和不就是(Sn+S1)*n/2?因为这个问题实在是太简单了,小C不屑于去解决它。这让小C的老师愤怒了,他就找了另外一个问题来问他。 小C的老师给了他一个长度为N的数字序列,每个位置有一个整数,他需要小C帮他找到这个数字序列里面有多少个等差数列。 …… 这个问题似乎太难了,小C需要你的程序帮他来解决这个问题。Input第一行一个整数N,表示老师给出的数字序列的长度。 第二行有N
阅读全文
摘要:算法:概率DP, dp[i] 表示到达i后还需要多少次可使游戏结束。。。#include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>#include<vector>#include<string>#include<math.h>#include<map>#include<set>#include<algorithm>using namespace std;#define Pe (1.0 / 6.
阅读全文
摘要:看了解题报告才会做....算法:线段树 + 动态规划线段树需要保存的信息:struct node{ int l,r; //左右端点 long long sum, max, min;//区间和,最大子序列和,最小子序列和 long long lmax, lmin, rmax, rmin;//左边连续最大和,左边连续子序列最小和,右边连续最大子序列和,右边连续最小子序列和 }seg[MAXN*4];自己想时遇到的主要问题是,如何处理最大子序列和是首尾相连的这一序列。。。不会处理这种问题。。。看了别人解题报告才知道,只要保留一个最小子序列和就可以了,然后总和减去这个最小子序列和。。如果1-N这个..
阅读全文
摘要:算法:最长上升子序列,求字符串的正序和逆序的最长上升子序列,N - dp[N][N]就是最少要添加的单词。View Code #include<iostream>#include<string>using namespace std;class Matrix{ public: int solve(int ); void input( ) { scanf("%s", pstr+1);} void reverse(int ); private: char pstr[5010]; char qstr[5010]; short int dp[...
阅读全文
摘要:1. dp求编辑距离2. bk树找相差d的单词。View Code #include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>#include<vector>#include<string>#include<math.h>#include<map>#include<set>#include<stack>#include<queue>#include<algorithm>
阅读全文
摘要:01背包。输出方案。View Code #include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>#include<stack>using namespace std;int v[1000], num[1000], Vp[1000];const int inf = 0x7f7f7f7f;int dp[1100][1100];int st[1110], top;//输出方案种类 void DFS( int x, int volume, int sum,
阅读全文
摘要:题意:要求在T时间内取N件物品,每种物品有其时间价值。同一条线上的必须依次取。算法:刚开始用树形DP做,也就是依赖背包。。TLE。而且跟据题目要求,必须节点取了,其子节点才能取。除了TLE,我的限定条件感觉对错也没有太大把握,做题时一定要正确选择算法,分析算法可行性(正确性,时间上,内存上),不要浪费时间。超时的树形DP:View Code #include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>#include<vector>#include<
阅读全文
摘要:题意:求用1 * 2 的矩行拼h * w的矩阵方法数(h,w <=11)算法:1.朴素算法,根据关系,枚举由于在做第i行dp时必须完全覆盖第i-1行,只要抓住这个条件不放就行。1、如果第i行中有0,则第i-1行一定为1;2、如果第i行中为1的x列第i-1行为0,说明第i行肯定是竖着放的;3、如果第i行中为1的x列第i-1行的该列也为1,可能性只有一个,第i行是横放的,所以第i行的x+1列也必须为1,又因为第i行的x+1列为1是因为横着放的,所以第i-1行的x+1列也必须为1。View Code //自己没写枚举暴力的代码了,速度很慢2000ms,代码来自//http://gisyhy.b
阅读全文
摘要:题意:中文题http://poj.org/problem?id=1185算法:N <= 100;M <= 10。枚举每行状态,1表示该行放炮兵,0表示不放,相邻两位不能有1,这样的状态才合法特殊处理第一行,第二行状态。int cow[110];//保存行状态信息 int num[100]; //保存状态数int sum[100]; //保存状态对应的1,即炮兵数int dp[110][64][64]; //dp方程, dp[i][j][k]表示第i行状态为j,上一行状态为k枚举后面的行。由前往后推,num[i]&num[j] == 0 num[i]&num[k] =
阅读全文
摘要:算法:dp[state][n]表示该状态前N位不是完美排列的个数。步骤:1.初始化第 0 位值2.第i位从第i-1位推出,每一位,枚举(1<<N)种状态。3.答案就是N!- dp[(1<<N)-1][N-1]View Code #include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>#include<vector>#include<string>#include<math.h>#include<m
阅读全文
摘要:DNA-AND-DNATime Limit : 3000/1000ms (Java/Other)Memory Limit : 65535/32768K (Java/Other)Total Submission(s) : 91Accepted Submission(s) : 45Font:Times New Roman|Verdana|GeorgiaFont Size:←→Problem Description生物学家们发现了一个奇怪的DNA分子,可以将它们看作一个由集合{A,B} 中的元素组成的N个字符的序列。由于一系列的突变使得DNA链只包含A。生物学家发现这很奇怪,所以他们开始研究更详细的
阅读全文
摘要:#include <stdio.h>#include <string.h>#include <stdlib.h>int dp[100010];int main( ){ int T, i, j, N, a, b, c, d, l, max, sum, flag ; scanf("%d",&T); l = 0; while (T--) { l++; //sum = max = 0; memset(dp, 0, sizeof(dp)); scanf("%d",&N); for (i = 1; i <=
阅读全文
摘要:#include <stdio.h>#include <string.h>#include <stdlib.h>int dp[11100];int main( ){ int T, i, j, max = 0, sum; int a, b, c, d; while ( scanf("%d",&T) , T ) { for (i = 0; i < T; i++) scanf("%d",&dp[i]); a = b = c = d = max = sum = dp[0]; for (i = 1; i &
阅读全文
摘要:二维。 滚动数组。。93ms 444kb#include <stdio.h>#include <string.h>#include <stdlib.h>#include <algorithm>using namespace std;int main( ){ int n, m, i, j; double dp[3][10010]; int mo[1010]; double p[1010]; while (scanf("%d%d", &n, &m), n || m ) { for (i = 0; i <= 2
阅读全文
摘要:状态方程: dp[i][j] += max (dp[i-1][j],dp[i-1][j-1]);#include <stdio.h>#include <string.h>#include <stdlib.h>#include <algorithm>using namespace std;int main( ){ int T, N, i, j, t; int dp[110][110]; scanf("%d",&T); while (T--) { t = 0; memset(dp, 0, sizeof(dp)); scan
阅读全文
摘要:一维。。0ms 198kb#include <stdio.h>#include <string.h>#include <stdlib.h>#include <algorithm>using namespace std;int main( ){ int N,T,V,dp[1100],value[1100],volume[1100]; scanf("%d",&T); while (T--) { int i, j; scanf("%d%d",&N,&V); for (i = 1; i &l
阅读全文
摘要:二维。46ms .4936kb#include <stdio.h>#include <string.h>#include <stdlib.h>#include <algorithm>using namespace std; int T, M, N, V, i, j, dp[1100][1100], value[1100], volume[1100];void print( ){ int i, j;for ( i = 0; i <= N; i++) { for ( j = 0; j <= V; j++) printf("%d
阅读全文
摘要:滚动数组。二维。。31ms 212kB#include <stdio.h>#include <string.h>#include <stdlib.h>#include <algorithm>using namespace std; int T, M, N, V, i, j, dp[3][1100], value[1100], volume[1100];int main( ){ scanf("%d",&T); while (T--) { scanf("%d%d",&N,&V); mem
阅读全文
摘要:1.01背包 什么是01背包呢,就是给你一个体积v的背包,N件物品,第i件物品价值v[i],体积为w[i]. 问你怎么样装使背包体积最大? 2.完全背包 完全背包就是给你N件物品,和一个体积为v的背包,每种物品无限可用,第i种物品价值为 v[i],体积为w[i],同样问你怎么样装使背包体积最大? 3.多重背包 多重背包也是给你给你N件物品,和一个体积为v的背包,但第i种物品有限,最多有n[i]...
阅读全文
摘要:此文转自黑水浮云空间/*DP解法:F[i][j]表示到第i个位置的字符位置,有j-1个未被匹配的‘(’的状态有多少种,那么 f[i][j]=f[i-1][j-1] s[i]=‘(’; f[i][j]=f[i-][j+1] s[i]=‘)’;f[i][j]=f[i-1][j-1]+f[i-1][j+1] s[i]=‘?';最后输出f[len-1][1]即可,之所以j不直接从0开始(即最后输出f[len-1][0]),是为了避免转移方程中出现j=0,使得减1后小于0。*/#include <iostream> using namespace std; int f[20][20]
阅读全文