蘑菇阵_字符串计数

举报
bug郭 发表于 2022/08/26 23:46:59 2022/08/26
【摘要】 蘑菇阵//error 未解之谜!!!!垃圾bug 2022 05 17 一道算法题整整一下午没调试出来,裂开!!!一杯茶,一道题,一个bug调一天...// write your code hereimport java.util.*;public class Main{ public static void main(String[] args){ Scanner s...

蘑菇阵

//error 未解之谜!!!!垃圾bug 2022 05 17 一道算法题整整一下午没调试出来,裂开!!!一杯茶,一道题,一个bug调一天...
// write your code here
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int N = sc.nextInt();
            int M = sc.nextInt();
            int k = sc.nextInt();
            double[][] arr = new double[N][M];
            boolean[][] table = new boolean[N][M];
            for(int i = 0;i<k;i++){
                int x = sc.nextInt();
                int y = sc.nextInt();
                table[x-1][y-1] = true;
            }

            //初始化
            arr[0][0] = 1;
            for(int i = 1;i<N;i++){
                //第一列
                if(table[i][0]){
                    //设置该位置概率为0!
                    arr[i][0] = 0;
                    break;//后面的概率都为0!
                }
                arr[i][0] = 0.5;
            }
            for(int i = 1;i<M;i++){
                //第一行!
                if(table[0][i]){
                    //设置该位置概率为0!
                    arr[0][i] = 0;
                    break;//后面的概率都为0!
                }
                arr[0][i] = 0.5;
            }
            for(int i = 1;i<N;i++){
                for(int j = 1;j<M;j++){
                    if(table[i][j]){//蘑菇位置!
                        arr[i][j] = 0;
                        continue;
                    }
                    if(i==N-1&&j==M-1){//最后一个位置!
                        //上面坐标只能往下走
                        //左边坐标只能往右走
                        arr[i][j] =  arr[i-1][j] + arr[i][j-1];
                        continue;
                    }
//                    if(i==N-1){//最后一行!
//                        //考虑边界!
//                        //说明左边位置只能往右走!否者越界!
//                       arr[i][j] =  0.5*arr[i-1][j] + arr[i][j-1];
//                       continue;
//                    }
//                    if(j==M-1) {//最后一列!
//                        //说明这里上面的位置坐标只能往下走!
//                        arr[i][j] = arr[i - 1][j] + 0.5 * arr[i][j - 1];
//                        continue;
//                    }
//                  //这里的前一个路径点可以有2种选择所以要乘0.5!
                // arr[i][j] = 0.5*arr[i-1][j] + 0.5*arr[i][j-1];
                    arr[i][j] = (i==N-1?1.0:0.5)*arr[i][j-1] +
                            (j==M-1?1.0:0.5)*arr[i-1][j];
                }
            }
            System.out.println(arr[N-1][M-1]);
        }
    }
}
//正确答案!
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int N = sc.nextInt();
            int M = sc.nextInt();
            int k = sc.nextInt();
            double[][] arr = new double[N+1][M+1];
            boolean[][] table = new boolean[N+1][M+1];
            for(int i = 0;i<k;i++){
                int x = sc.nextInt();
                int y = sc.nextInt();
                table[x][y] = true;
            }

            //初始化
            arr[1][1] = 1.0;
            for(int i = 1;i<=N;i++){
                for(int j = 1;j<=M;j++){
                    if(i==1&&j==1)continue;
                    if(table[i][j]){//蘑菇位置!
                        arr[i][j] = 0;
                        continue;
                    }
                    arr[i][j] = (i==N?1.0:0.5)*arr[i][j-1] +
                            (j==M?1.0:0.5)*arr[i-1][j];
                }
            }
            System.out.printf("%.2f\n",arr[N][M]);
        }
    }
}

总结:

动态规划问题老老实实多开辟一行一列吧!

害,还有这里的概率要会分析!

字符串计数

字符串计数

image-20220518080121052

image-20220518075853072

// write your code here
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            //一组测试用例!
            StringBuffer str1 = new StringBuffer(sc.next());
            StringBuffer str2 = new StringBuffer(sc.next());
            int len1 = sc.nextInt();
            int len2 = sc.nextInt();
            //将str1 和 str2 补位到len2
            for(int i = str1.length();i<len2;i++){//str1 补 a
                str1.append('a');
            }
             for(int i = str2.length();i<len2;i++){//str2 补'z'+1
                str2.append('z'+1);
            }
            //用于保存字符串相减后每位的差值!
            //便于计算每个长度的个数
            int[] array = new int[len2];
            for(int i = 0;i<len2;i++){
                array[i] = str2.charAt(i) - str1.charAt(i);
            }
            //进行求和!
            int result = 0;
            for(int i = len1;i<=len2;i++){//长度[len1,len2]
                for(int j = 0;j<i;j++){ //计算每一个长度的个数!
                    //进行多少位的相减!
                    result += array[j]*Math.pow(26,i-j-1);// 1位 26^0 2位 26^1 ....
                }
            }
            System.out.println((result-1)%1000007); //减去str2 重复计算!
        }
    }
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。