摘要:
题目:给出两个顶点并且给出两个顶点之间的概率,求从1到n的最大的概率分析:纯粹是dijkstra算法,只不过把最短路径改动一下而已要先定义dp[n]=1;后面的直接套用dijkstra模板,把min部分改为max即可,并且之前加的部分改为相乘即可dijkstra模板:设图由邻接矩阵g存储。memset(dist,0x3f,sizeof(dist));memset(used,false,sizeof(used));dist[0]=0;//设0为源点for(i=0;i<n;i++)//循环n次{min=10000000;for(j=0;j<n;j++)//找到最小值if(!used[j 阅读全文
摘要:
第一道懂的深度优先搜索题,找图中八连块的个数#include <iostream>#include <cstring>using namespace std;#define X 100int visit[X][X];int a[X][X];void dfs(int x,int y) //深度优先搜索{if(visit[x][y]||!a[x][y]) //如果是白色或者是遍历过的return;visit[x][y] = 1; //遍历过的标记为一dfs(x-1,y-1); dfs(x-1,y); dfs(x-1,y+1); //递归遍历周围dfs(x,y-1); dfs 阅读全文
摘要:
题目:回文是一个对称的字符串,换句话说,这个字符串从左到右读和从右到左读是一样的。给出一个字符串,你要编一个程序,决定要插入的最少的字符个数,使得原字符串成为一个回文。比如,字符串”Ab3bd”中插入2个字符,使得它能变成一个回文("dAb3bAd" 或 "Adb3bdA")。如果插入少于2个字符,将无法产生回文。求最少插入几个字符,使其变成回文字符串分析:S1 = Ab3bd 的反转为S2 = db3ba要使S1变成回文字符串,可先求出S1,S2的最长公共子序列,用n-lcs(S1,S2)即可,本题转化为求S1,S2的最长公共子序列状态转移方程:if( 阅读全文
摘要:
******************************************************************************* 简单题(包括枚举,二分查找,(复杂)模拟,基础数据结构(栈、队列),杂题等 * ******************************************************************************1001 A+B1002 A+B+C1009 Fat Cat1010 The Angle1011 Unix ls1012 Decoding Task1019 Grandpa's Other Est 阅读全文
摘要:
/*记忆化搜索,每次遍历到该位置,先把他能够遍历的邻点遍历完,直到不能遍历为止,然后选择四个可走的邻接点的最值,利用数组记录当前位置的最优值,若遇到已经遍历过的位置时,直接返回该位置的最优值,完成该次递归*/#include <iostream>#include <cstring>#include <cstdio>using namespace std;#define X 102int map[X][X],dp[X][X],n,m;int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; //状态偏移量int f(int x, 阅读全文
摘要:
题目:纯粹最长上升子序列(lis:Longest Increasing Subsequence)状态转移方程(时间复杂度为O(n*n)) if(a[i]<a[j])dp[i]=Max(dp[i],dp[j]+1);解一:根据状态转移方程:if(a[i]<a[j])dp[i]=Max(dp[i],dp[j]+1);#include <iostream>#include <cstring>using namespace std;#define X 1003int dp[X];int a[X];int Max(int a,int b){return a>b? 阅读全文
摘要:
/*题目: 求最大子矩阵的和分析: 我的做法: 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 我们可以按每一行计算从j开始到k结束的该段和,用dp[i][j][k] 表示第i行的元素从下标j开始到k结束的和,把每一行的都求出, 从而转化为求每一列的最大子序和,本例中, 先求dp[0][0][0] = a[0][0],dp[0][0][1] = a[0][0]+a[0][1],... 从而求完n行,时间复杂度为O(n*n*n),然后每一列dp根据一维最大 子序列和来计算,算出最大的和即... 阅读全文
摘要:
参考别人的程序后弄明白了,看来我还是很菜啊==!别人:状态定义为dp[i],在i之前要达到合法message需要删除的最少的字符数,转移的时候是dp[i-1]+1和dp[i-(能匹配的字典串的长度+需要删除的字符串的长度)]+需要删除的字符串的长度。自己:定义状态为dp[i],dp[i]为i前的单词最少要删除的字母数,当i=i+1时,判断target[i]==word[j][word[j].size()-1]是否相等,即判断该单词与字典中的单词的最后一位是否匹配,匹配的话往前算算是否该字典中的单词全部出现在要求匹配单词中,如果是并且该dp小于dp[i]+1的话,转移!转移方程为:dp[i]=m 阅读全文
摘要:
矩阵链乘法:矩阵P={}标准模板:for(int i=2;i<=n;i++)for(int j=1;j<=n-i+1;j++){int temp = i+j-1;dp[j][temp] = 1000000000;for(int k=j;k<=temp-1;k++){v = dp[j][k]+dp[k+1][temp]+p[j-1]*p[k]*p[temp];if(v<dp[j][temp]){dp[j][temp] = v;s[j][temp] = k;}}}相乘次数(答案) = dp[1][n]打印最佳链乘表达式:void print(int i,int j){if( 阅读全文
摘要:
莫非就是最长子序列和?#include <iostream> using namespace std;#define X 10002int a[X];int main(){freopen("sum.in","r",stdin);freopen("sum.out","w",stdout);int n;while(cin>>n,n){for(int i=0;i<n;i++)cin>>a[i];int max = -2001;int sum = 0;for(int i=0;i&l 阅读全文