zoukankan      html  css  js  c++  java
  • 2018秋招blibli算法工程师

    我给出代码如下:和之前做数塔(dp的入门题目)的思路一致

    dp[i][j]为走到坐标(i,j)的最小减速(只有向右走和向上走两种情况)

    #include<stdio.h>
    #include<stdlib.h>
    #include<iostream>
    #include <algorithm>
    using namespace std;
    const int maxn=1002;
    int dp[maxn][maxn]; 
    int main()
    {int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        cin>>dp[i][j];
        
        for(int i=0;i<n;i++)//因为不走回头路所以最上面的一行和最左面一列只有一种情况 
        {
        for(int j=0;j<n;j++)
        {
        if(i==0&&j>=1)dp[i][j]+=dp[i][j-1];
        else if(j==0&&i>=1)dp[i][j]+=dp[i-1][j];
        else if(i>=1&&j>=1)    dp[i][j]+=min(dp[i][j-1],dp[i-1][j]);
        }
        }
    //测试 
    //    for(int i=0;i<n;i++)
    //    {
    //    for(int j=0;j<n;j++)
    //    cout<<dp[i][j]<<" ";
    //        cout<<endl;
    //    }
    cout<<dp[n-1][n-1]<<endl;
    
        return 0;
    }

      

    个人代码如下:

    #include<stdio.h>
    #include<stdlib.h>
    #include<iostream>
    #include<string>
    #include <algorithm>
    using namespace std;
    const int maxn=10005; 
    int main()
    {    
        string s1,s2;
        int ver1[maxn];//把版本数字分离出来放在数组中
        int ver2[maxn];
        cin>>s1>>s2;
        fill(ver1,ver1+maxn,0);
        fill(ver2,ver2+maxn,0);
         int top1=0,top2=0;
         int sum=0;
        for(int i=0;i<s1.size();i++)
        {
        
            if(s1[i]!='.')
            {    
                sum=sum*10+(s1[i]-'0'); 
            }
            if(s1[i]=='.'||i==s1.size()-1) 
            {
            ver1[top1]=sum;
            top1++;
            sum=0;
            }
            
        }sum=0;
        for(int i=0;i<s2.size();i++)
        {
            if(s2[i]!='.')
            {    
                sum=sum*10+(s2[i]-'0'); 
            }
            if(s2[i]=='.'||i==s2.size()-1) 
            {
            ver2[top2]=sum;
            top2++;
            sum=0;
            }
            
        }
        int f=0;
        for(int i=0;i<(top1>=top2? top1:top2);i++)
        {
            if(ver1[i]>ver2[i]) {
                f=1;break;
            }
            if(ver1[i]<ver2[i]){
                f=-1;break;
            }
            
        }cout<<f<<endl;
        
        
        return 0;
    }

      

    解题思路:和之前写1-n*n的思路差不多,只不过这次我没有加围墙是加了一个访问数组进行判断

    加围墙的思路:https://www.cnblogs.com/cstdio1/p/10903090.html

    代码如下:

    #include <iostream>
    #include<string>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int maxn=1005;//之前maxn给的10005内存超限
    int a[maxn][maxn];
    bool vis[maxn][maxn];//是否访问数组
     
    int main ()
    {
        int m,n;//m行n列的矩阵
        int i,j;
        
        while(cin>>m&&cin>>n&&m!=-1&&n!=-1){
             
            for(i=0;i<m;i++)
            for(j=0;j<n;j++)
                cin>>a[i][j];
    
            int cnt=0;//计算输出元素个数 
            memset(vis,0,sizeof(vis));//重置标志数组 
            i=0;j=0;//初始化起点坐标
            while(cnt<n*m)
            {
            while(j<n&&!vis[i][j])//turn right
            {
            cout<<a[i][j]<<(cnt==n*m-1? "":",");
            vis[i][j]=true;
            j++;cnt++; 
            }i++;j--;//和之前我写1-n*n填数是一样的
             
            while(i<m&&!vis[i][j])//turn down
            {
            cout<<a[i][j]<<(cnt==n*m-1? "":",");
            vis[i][j]=true;
            i++;cnt++;     
            }i--;j--;
             
            while(j>=0&&!vis[i][j])//turn left
            {
            cout<<a[i][j]<<(cnt==n*m-1? "":",");
            vis[i][j]=true;    
            j--;cnt++;     
            }i--;j++;  
             
            while(i>=0&&!vis[i][j])//turn up
            {
            cout<<a[i][j]<<(cnt==n*m-1? "":",");
            vis[i][j]=true;
            i--;cnt++;     
            }i++;j++;
             
           }cout<<endl;
             
             
             
        }
     
     
     
    }
      
    不一样的烟火
  • 相关阅读:
    1.5寻找倒数第k个元素
    MySQL基础之分组函数
    MySQL基础之单行函数
    MySQL基础查询(一)
    gem install redis Fetching: redis-4.1.3.gem (100%) ERROR: Error installing redis: redis requires Ruby version >= 2.3.0.
    SQL语句
    使用kill无法杀死mysql进程
    Ansible学习笔记
    rsync报错:rsync: chgrp ".hejian.txt.D1juHb" (in backup) failed: Operation not permitted (1)
    Linux磁盘管理
  • 原文地址:https://www.cnblogs.com/cstdio1/p/11083964.html
Copyright © 2011-2022 走看看