SRM551 Div1Medium ColorfulWolves

来源:互联网 发布:济宁淘宝代运 编辑:程序博客网 时间:2024/05/18 00:56

【分析】
题目有点奇怪,你必须先多模拟几次样例才会知道这是什么意思。
首先我们考虑从颜色i到颜色j所需要的最小花费是多少。这个应该比较简单,代价应该是对于切到[0,j-1]的“Y”的个数cnt。(因为如果考虑那些某些奇奇怪怪的切换方式,不会写
那么dis[i][j]=cnt。
接下来一次Folyd就完成了。

【代码】

#include <bits/stdc++.h>using namespace std;#define M 55#define oo 1e9char str[M][M];int dis[M][M];int n;int main(){    scanf("%d",&n);    for(int i=0;i<n;i++){        for(int j=0;j<n;j++)dis[i][j]=oo;    }    for(int i=0;i<n;i++){        scanf("%s",str[i]);        int w=0;        for(int j=0;j<n;j++){            if(str[i][j]=='Y')dis[i][j]=w++;        }    }    for(int k=0;k<n;k++){        for(int i=0;i<n;i++){            for(int j=0;j<n;j++){                dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j]);            }        }    }    if(dis[0][n-1]==oo)dis[0][n-1]=-1;    printf("%d\n",dis[0][n-1]);    return 0;}

其实考虑整个大问题的时候当然会有点无从下手,但是你可以自己多问一些问题,然后试着解决它。如果运气好的话,整个大问题就迎刃而解了。

1 1
原创粉丝点击