2021年上海交通大学计算机系考研机试题

三个题全是Leetcode原题,按照考场老师的说法今年的机试算是简单的了

674. 最长连续递增序列

leecode原题 https://leetcode-cn.com/problems/longest-continuous-increasing-subsequence/

class Solution {
public:
    int findLengthOfLCIS(vector<int>& nums) {
        if(nums.size()==0)return 0;
        vector<int>dp(nums.size()+1,1);
        int ans=1;
        for(int i=1;i<nums.size();++i){
            if(nums[i]>nums[i-1])dp[i]=max(dp[i],dp[i-1]+1);
            ans=max(ans,dp[i]);
        }
        return ans;
    }
};

983. 最低票价

leetcode原题 https://leetcode-cn.com/problems/minimum-cost-for-tickets/
正推法

class Solution {
public:
    int mincostTickets(vector<int>& days, vector<int>& costs) {
        vector<int>dp(days.size()+1);
        int m=min(costs[0],min(costs[1],costs[2]));
        for(int i=1;i<=days.size();++i){
            dp[i]=min(i*m,dp[i-1]+m);
            for(int j=1;j<=6;++j){
                if(i-j-1>=0&&days[i-1]-days[i-j-1]<=6)dp[i]=min(dp[i],dp[i-j-1]+costs[1]);
            }
            for(int j=1;j<=29;++j){
                if(i-j-1>=0&&days[i-1]-days[i-j-1]<=29)dp[i]=min(dp[i],dp[i-j-1]+costs[2]);
            }
            //cout<<i<<' '<<dp[i]<<endl;
        }
        return dp[days.size()];
    }
};

倒推法:
当前状态是否最优与后面的元素有关,所以可以使用倒推法规避后面元素的干扰

class Solution {
public:
    int mincostTickets(vector<int>& days, vector<int>& costs) {
        int m=min(costs[0],min(costs[1],costs[2]));
        int dp[400],vis[400];
        memset(dp,0,sizeof(dp));
        memset(vis,0,sizeof(vis));
        for(int x:days){
            vis[x]=1;
        }
        for(int i=days[days.size()-1];i>=0;--i){
            if(vis[i]){
                dp[i]=min(dp[i+1]+costs[0],min(dp[i+7]+costs[1],dp[i+30]+costs[2]));
            }else dp[i]=dp[i+1];
        }
        return dp[0];
    }
};

996. 正方形数组的数目

leetcode原题 https://leetcode-cn.com/problems/number-of-squareful-arrays/
考场上写的会超时的版本,能过一半,满足我的个人追求了
50 / 76 个通过测试用例

class Solution {
public:
    bool isSq(vector<int>& A){
        for(int i=1;i<A.size();++i){
            int sum=A[i-1]+A[i];
            int sq=sqrt(sum);
            if(sq*sq!=sum)return false;
        }
        return true;
    }
    int numSquarefulPerms(vector<int>& A) {
        sort(A.begin(),A.end());
        int ans=0;
        do{
            if(isSq(A))ans++;
        }while(next_permutation(A.begin(),A.end()));
        return ans;
    }
};

我的刷题笔记

https://github.com/sherpahu/AlgorithmsNotes
梳理了STL的用法,整理了常考的知识点(DP、图论等),如果觉得对你有帮助,不妨给我一个star 😃

  • 9
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值