摘要:
搞了一天终于AC了,感觉题目有点问题,没有说有多个可行顺序的情况如何输出,然而测试数据是按照某一个顺序输出的。比如说:101 010 是按照111222输出,其实(如果题意我没有读错的话)121212 221112应该也是正确的。听说这道题有一定的改动,是不是出题人忽视了呢????令res[i][j]表示串1的前i个字符与串2的前j个字符是否能够按照规则分成两堆。res[i][j]= (res[i-1][j-1] && str1[i]!=str2[j]) || (res[i-2][j] && str1[i]!=str1[i-1]) || (res[i][j-2] 阅读全文
摘要:
简单背包,不过直接背包会超时,需要将每一种物品个数转化一下,方法是:将第i种物品分成若干件物品,其中每件物品有一个系数,这件物品的费用和价值均是原来的费用和价值乘以这个系数。使这些系数分别为 1,2,4,...,2^(k-1),n[i]-2^k+1,且k是满足n[i]-2^k+1>0的最大整数。例如,如果n[i]为13,就将这种 物品分成系数分别为1,2,4,6的四件物品。代码如下:#include<iostream>#include<cstdio>#include<cstring>using namespace std;int coin[7],res 阅读全文
摘要:
并查集 讲解看如下博客:http://start07.yo2.cn/articles/ural-1003-parity.html#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define BLOCK 10000int HashTable[20000],father[20000],Rank[20000],N;int Hash(int a){ int i; for(i=1;i<N;i++) if(HashTable[i]==a) return i; HashT 阅读全文
摘要:
想了很久,才知道用线段树来做,实现也不算太复杂。#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define SIZE 262145struct node{ int i,left,right,sum;};node vert[SIZE<<2];int treeNode;int build(int i,int left,int right){ int mid; vert[i].left=left; vert[i].right=right; vert[i]. 阅读全文
摘要:
简单的树形DP,状态转移方程如下:令res[i]表示以i为根的子树获得的最大值;第i个人去或者不去。去的话,res[i]=value[i]+∑res[j], j表示i的孩子的孩子;不去的话,res[i]=∑res[k],k表示i的孩子;因此,res[i]=max{value[i]+∑res[j],∑res[k]};代码如下:#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define MAX 123456789struct node{ int i,next;}ve 阅读全文
摘要:
令res[i]表示到达第i个站点所用的最小费用;状态转移方程如下:res[i]=min{res[k]+f(L1,L2,L3)};(1<=k<i)代码如下:#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define MAX 1234567890int res[10001],dist[10001],L1,L2,L3,C1,C2,C3;int min(int a,int b){ return a < b ? a : b;}int work(int s 阅读全文
摘要:
简单的一道DP,只不过是每个状态与三个子状态有关,令res[i][j]表示从第一层到达map[i][j]的最小费用。本应该res[i][j]=min(res[i-1][j],res,[i][j+1],res[i][j-1])+map[i][j];但是在res[i][j+1]是在res[i][j]求出来之后才求出来,那我们怎么办呢?我们可以这样处理:每一行正反各求一次取最小值。#include<iostream>#include<cstdio>#include<cstring>#include<stack>using namespace std;# 阅读全文
摘要:
树形DP,令res[i][j]表示以i为根的子树删除j条边所保留的最大苹果数;res[i][j]=max(res[i][j],res[lChild][k]+res[rChild][j-k]+value[i]);(0<=j<=inum[i],0<=k<=inum[lChild])inum[i]表示以i为根的子树树枝的个数,value[i]以i为端点的树枝的苹果树。代码如下:#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define MAX 阅读全文
摘要:
StaircasesTime Limit: 1.0 second Memory Limit: 16 MBOne curious child has a set of N little bricks (5 ≤ N ≤ 500). From these bricks he builds different staircases. Staircase consists of steps of different sizes in a strictly descending order. It is not allowed for staircase to have steps equal sizes 阅读全文
摘要:
K-based NumbersTime Limit: 1.0 secondMemory Limit: 16 MBLet’s consider K-based numbers, containing exactly N digits. We define a number to be valid if its K-based notation doesn’t contain two successive zeros. For example:1010230 is a valid 7-digit number;1000198 is not a valid number;0001235 is not 阅读全文