05 2012 档案
摘要:令res[i][j]表示前i个邮局负责前j个村庄的最小值。res[i][j]=res[i-1][k] + dist(k+1,j), (i<=j<=m,i-1<=k<j);#include<iostream>#include<cstdio>#include<cstring>using namespace std;int pos[301],res[35][301];#define MAX 1234567890int min(int a,int b){ return a < b ? a : b;}int dist(int i,int
阅读全文
摘要:简单DP;状态转移方程如下:令len[i][j]表示串1前i个字符与串2前j个字符所得到的符合要求的串的最短长度。令res[i][j]表示串1前i个字符与串2前j个字符所得到的符合要求的最短串的方案数。len[i][j] = str1[i]==str2[j] ? len[i-1][j-1] +1: min(len[i-1][j],len[i][j-1])+1。若str1[i]==str2[j],res[i][j]=res[i-1][j-1];若 str1[i]!=str2[j] ,分三种情况:(1)len[i-1][j] < len[i][j-1] , res[i][j]=res[i-1
阅读全文
摘要:简单DP#include<iostream>#include<cstdio>#include<cstring>using namespace std;char map[2][1410];int S[4][2][1410],s[4][2][1410],smax,Smax;int max(int a,int b){ return a > b ? a : b;}int work(int n,int e){ int i; for(i=1;i<=n;i++) { if(map[e][i]=='S') { if(map[1-e][i...
阅读全文
摘要:#include<windows.h>#include<iostream.h>#include<stdio.h>HANDLE g_hProcess;DWORD dwGoalAddr[1024],count;int CompareAPage(DWORD dwBase,DWORD goal){ DWORD i; BYTE arBytes[4096]; if(!::ReadProcessMemory(g_hProcess,(LPVOID)dwBase,arBytes,4096,NULL)) { return FALSE; } DWORD * lpDw...
阅读全文
摘要:查找进程中QQ进程并终止该进程#include<windows.h>#include<stdio.h>#include<tlhelp32.h>DWORD FindProcess(char * fileName)//查找进程{ PROCESSENTRY32 pe32={sizeof(PROCESSENTRY32)}; HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if(hSnapshot==INVALID_HANDLE_VALUE) { printf("获取进程快照失
阅读全文
摘要:简单的01背包,关键是找路径,通过此题对01背包找路径有了更深的认识了。#include<iostream>#include<cstdio>#include<cstring>#include<stack>using namespace std;int res[100010],nPath[100010],father[100010],data[110];int work(int goal,int n){ int i,j; memset(res,0,sizeof(res)); memset(nPath,0,sizeof(nPath)); memset
阅读全文
摘要:纠结了一天也没有想到怎么用DP来做,看了看大牛的想法顿时茅塞顿开:结果是要求从i到j需要多少天,假如用res[i][j]来表示,那么假如我们知道res[1][i]和res[1][j]的话,res[i][j]=res[1][j]-res[1][i] (i<=j),因此转化为求res[1][i]和res[1][j];而2的整数次幂可以直接求出若用r[i]表示res[1][2^i]的结果r[i]=2*r[i-1]+i-1;画一画就可以看得出来。然后根据r[i]的值递归求任何一个res[1][k],如何递归呢?拿个Res[1][11]来说吧:先找出大于11的最大2的整数次幂8;Res[1][11
阅读全文
摘要:题意:找出n的最小倍数,要求这个倍数十进制由1和2组成。看了discuss才知道确实可以用DP来做:令res[i][j]表示前i位对n取余为j是否可以得到。res[i][(10%n*j+1)%n]=res[i-1][j];res[i][(10%n*j+2)%n]=res[i-1][j];用到(a * b) % n=(a % n * b % n) % n;假如我们知道res[i][j]按照上面的公式顺着推很容易得到res[i+1][(10%n*j+1)%n]和res[i+1][(10%n*j+2)%n]的值,但是逆着推就不容易了。不管怎么说还是和01背包一个性质的。但是,提交后MLE,由于找路径
阅读全文
摘要:最小表示法: 初始时,i=0,j=1,分别以i,j,为起始点顺着i,j,往下比较直到找的str[i+k]!=str[j+k],然后分两种情况考虑:1、 str[i+k]>str[j+k],i变成i=i+k+1,j不变,然后继续往下比较。2、 str[i+k]<str[j+k],j变成j=j+k+1,i不变,然后继续往下比较。直到i或j大于串长,找较小者。说说我的疑惑吧: 用枚举方法我们很好理解,一某一点i为起点,不断查看以i后的点为起点的串是否小于以i为起点的串,这理解起来不难。我们假设以i点为起点的串为S1,以j点为起点的串S2,而用最小表示法的话,需要找的S1、S2第一个不相等
阅读全文
摘要:简单贪心,贪心原则是将每一个单调序列尽可能的大。#include<iostream>#include<cstdio>#include<cstring>using namespace std;int data[100001];int work(int m,int n){ int head=m+1,count=0; if(n-m<=1) return 1; while(head<=n) { count++; while(data[head]==data[head-1]) head++; if(data[head]>data[head...
阅读全文
摘要:用动态规划超时了,悲剧,没想到可以用贪心O(n)就搞定了。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct node{ int x,y;}vert[100010];int res[100010];int cmp(node a,node b){ return a.x < b.x;}int work(int n,int m){ int i,k=0,max=0,count=0,pre=0; if(n==0
阅读全文
摘要:简单DP,状态转移方程如下:res[i][j]=min(res[i][j],res[k][j-1]+fact(k+1,i)) (1<=j<i && j<=m, 1<=i<=n, 1<=k<i);fact(i,j)表示从i到j的系数。#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define MAX 1234567890int res[501][501],fact[501][501],horse[501];
阅读全文
摘要:令res[i][0]表示升级到i并且是正版的最小消费,res[i][1]表示升级到i并且是盗版的最小消费。res[i][0]=min(res[i][0],res[k][0]+edge(k,i)) (其中k必须可以升级到i,并且保证升级到i是正版);res[i][1]=min(res[i][1],res[k][x]+edge(k,i)) (其中res[k][x]表示正版盗版都行,关键保证升级到i是盗版)简单DP不用再说了,不过就是用到临界表来存储边,减小空间复杂度(姑且这样说)。#include<iostream>#include<cstdio>#include<c
阅读全文
摘要:令res[i][j][0]表示数字和为i,数字平方和为j的可能性,要么为0要么为1,;res[i][j][1]表示至少有多少位数字。res[i][j][0]=res[i-k][j-k*k] ? 1 : 0;(1<=k<=9 , 1<=i<=900,1<=j<=8100)res[i][j][1]=min(res[i][j],res[i-k][j-k*k]+1);然后根据res[i][j][1]寻找最优解需要预处理一下,不然可能TLE,之前没有预处理TLE了n次。。。。。。。#include<iostream>#include<cstdio&g
阅读全文
摘要:第一道树状数组,每个第一道都那么艰难……..#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define MAX 1234567890int res[10010],data[10010];int lowbite(int x){ return x & (x^(x-1));}int GetSum(int i){ int t=0; while(i>0) { t+=res[i]; i-=lowbite(i); } return t;}int A...
阅读全文
摘要:令res[i][j]表示从i到j是否是回文串。res[i][j]= (str[i]==str[j] && res[i+1][j-1]) ;接下来是如何找最少个数回文串,令inum[i]表示从1到i至少有多少个回文串,再次用DP;inum[i]=min(inum[j]+1),(其中res[j][i]==1,1<=j<i);最后根据inum[i]的值寻找一种可行的方案。O(n^2)的时间复杂度,O(n^2)的空间复杂度,网上还有更好的代码,竟然没有看懂#include<iostream>#include<cstdio>#include<cs
阅读全文