P8597 [蓝桥杯 2013 省 B] 翻硬币
因为把相邻两个硬币翻转两次相当于不翻,所以最优方案中同一组硬币最多只会翻转一次,故翻转顺序无后效性,考虑贪心:从前往后比较,发现一个不同的硬币就把它和他后面的硬币翻转,计数器累加,这样最后累加结果一定是最优方案的次数。
#include<bits/stdc++.h>
using namespace std;
char a[1009],b[1009];
int main(){scanf("%s",a);scanf("%s",b);int n=strlen(a);int cnt=0;for(int i=0;i<n;i++){if(a[i]!=b[i]){cnt++;a[i]=b[i];if(a[i+1]=='o')a[i+1]='*';else a[i+1]='o';}}printf("%d",cnt);return 0;
}
P8637 [蓝桥杯 2016 省 B] 交换瓶子
和上面那道题有点类似,都是交换,这个也是贪心的思路
读入并遍历瓶子的序列,如果该瓶子位置正确可以直接忽视,如果不对,答案加一,往后扫,扫到对应位置的瓶子就交换位置,然后下一个瓶子继续
#include<bits/stdc++.h>
using namespace std;
int a[10009];
int main(){int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}int ans=0;for(int i=1;i<=n;i++){if(a[i]!=i){for(int j=i;j<=n;j++){if(a[j]==i){int temp=a[j];a[j]=a[i];a[i]=temp;ans++;break;}}}}printf("%d",ans);return 0;
}
P1434 [SHOI2002] 滑雪
这题直接dfs会tle,所以要采用记忆化搜索,把每次搜到的点的结果记录下来,下次再经过这个点时可以直接用上次搜到的结果,可以省下许多时间
#include<bits/stdc++.h>
using namespace std;
int maps[111][111],s[111][111],dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
bool use[111][111];
int n,m,cnt;
int dfs(int x,int y){if(s[x][y])return s[x][y];s[x][y]=1;for(int i=0;i<4;i++){int xx=x+dx[i],yy=y+dy[i];if(xx>0&&yy>0&&xx<=n&&yy<=m&&maps[xx][yy]<maps[x][y]){dfs(xx,yy);s[x][y]=max(s[x][y],s[xx][yy]+1);}}return s[x][y];
}
int main(){scanf("%d %d",&n,&m);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){scanf("%d",&maps[i][j]);}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cnt=max(cnt,dfs(i,j));}}printf("%d",cnt);return 0;
}
邻接矩阵介绍
邻接矩阵就是利用二维矩阵表示图中各顶点之间的关系,对于有n个顶点的图来说,用n阶方阵来表示该图,其中矩阵元素表示从顶点到之间的边,的大小表示边的权值。如果顶点到没有边,则可以将设置为0或者。
如下图所示,左边是一个无向图,右边是其对应的邻接矩阵,该图是无权图,因此有边的值都设置为1。
下面是有向图及其邻接矩阵
从上面可见,无向图的邻接矩阵是关于主轴对称的,第i行或第j列就是顶点的度(边数)。图中的边数为"1的个数"/2。对于有向图,由于其具有方向性,因此邻接矩阵一般是不对称的,第i行1的个数是顶点的出度,第i列1的个数是其入度。图的边数等于矩阵中1的个数。
对于带权图来说,只需要将1替换为边的权值即可,下面是带权图及其邻接矩阵。
其中,表示没有边,可以是一个计算机能够接受的较大的值即可。
总结
图的邻接矩阵表示的优点: 非常直观,并且容易实现,编写算法也较简便,因而应用较广; 根据矩阵元素Aij=1或0,便于判定两个顶点之间是否有边(弧)相连; 计算顶点的度数,或有向图的入度、出度方便; 计算图的边数算法简单等。
图的邻接矩阵表示的缺点: 邻接矩阵事实上是一种顺序存储结构,具有顺序结构共有的缺点,比如:只能按最大空间需求申请内存空间、插入和删除顶点复杂等; 空间复杂度高,n个顶点的图,存储邻接矩阵需要n2个单元,如果一个图的顶点数较多,但边(弧)数较少的话--稀疏图,邻接矩阵一样需要n2个存储单元,就太浪费存储空间; 统计图的边数算法虽然简单,用双重循环统计“1”的个数即可,但其时间复杂度为O(n2)。