首页 > 试题广场 >

假设有三个进程P1、P2、P3共享某类资源, 它们的最大需

[问答题]

假设有三个进程P1P2、P3共享某类资源, 它们的最大需求资源数分别为(1049) 该类资源的总数为12个。各时刻进程申请资源的情况如下表, 采用银行家算法来避免死锁。T4时刻各进程所处的状态P1(A)P2(B)] P3(C)

选择答案:

(I)就绪

(2)运行

(3)阻塞

(4)完成

#include <string>
#include <vector>
#include <iostream>
using namespace std;
int minCost(string& str1, string& str2, int ic, int dc, int rc) {
    int n = str1.size();
    int m = str2.size();
    vector<vector<int>> dp(n+1, vector<int>(m+1, 0));
    for(int i = 0; i < n; i++) {//把str1的子串换成空串的代价
        dp[i+1][0] = (i+1) * dc;
    }
     
    for(int j = 0; j < m; j++) {//str1的空子串转换成str2子串的代价
        dp[0][j+1] = (j+1) * ic;
    }
     
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= m; j++) {
            if(str1[i-1] == str2[j-1]) {
                dp[i][j] = dp[i-1][j-1];
            }
            else {
                dp[i][j] = dp[i-1][j-1] + rc; //替换的代价
                //int dCost = dp[i-1][j] + dc; //删除的代价
                //int iCost = dp[i][j-1] + ic; //插入的代价
                //dp[i][j] = min(dp[i][j], min(iCost, dCost));
            }
            /**
            这里算是一个思维陷阱。dp[i-1][j]表示str1[0...i-2]变成str2[0...j-2]的代价,因此需要删掉str1[i-1]。很容易反过来理解。
            下面3句代码,放在else里也是OK的,说明一个问题,在当前两个字符相等时,用dp[i-1][j-1]代表dp[i][j]一定是最小代价。
            **/
            int dCost = dp[i-1][j] + dc; //删除的代价
            int iCost = dp[i][j-1] + ic; //插入的代价
            dp[i][j] = min(dp[i][j], min(iCost, dCost));
        }
    }
    return dp[n][m];
}
int main() {
    string s1, s2;
    cin >> s1 >> s2;
    int ic, dc, rc;
    cin >> ic >> dc >> rc;
    cout << minCost(s1, s2, ic, dc, rc) << endl;
    return 0;
}

#include <string>
#include <vector>
#include <iostream>
usingnamespacestd;
intminCost(string& str1, string& str2, intic, intdc, intrc) {
    intn = str1.size();
    intm = str2.size();
    vector<vector<int>> dp(n+1, vector<int>(m+1, 0));
    for(inti = 0; i < n; i++) {//把str1的子串换成空串的代价
        dp[i+1][0] = (i+1) * dc;
    }
     
    for(intj = 0; j < m; j++) {//str1的空子串转换成str2子串的代价
        dp[0][j+1] = (j+1) * ic;
    }
     
    for(inti = 1; i <= n; i++) {
        for(intj = 1; j <= m; j++) {
            if(str1[i-1] == str2[j-1]) {
                dp[i][j] = dp[i-1][j-1];
            }
            else{
                dp[i][j] = dp[i-1][j-1] + rc; //替换的代价
                //int dCost = dp[i-1][j] + dc; //删除的代价
                //int iCost = dp[i][j-1] + ic; //插入的代价
                //dp[i][j] = min(dp[i][j], min(iCost, dCost));
            }
            /**
            这里算是一个思维陷阱。dp[i-1][j]表示str1[0...i-2]变成str2[0...j-2]的代价,因此需要删掉str1[i-1]。很容易反过来理解。
            下面3句代码,放在else里也是OK的,说明一个问题,在当前两个字符相等时,用dp[i-1][j-1]代表dp[i][j]一定是最小代价。
            **/
            intdCost = dp[i-1][j] + dc; //删除的代价
            intiCost = dp[i][j-1] + ic; //插入的代价
            dp[i][j] = min(dp[i][j], min(iCost, dCost));
        }
    }
    returndp[n][m];
}
intmain() {
    string s1, s2;
    cin >> s1 >> s2;
    intic, dc, rc;
    cin >> ic >> dc >> rc;
    cout << minCost(s1, s2, ic, dc, rc) << endl;
    return0;
}
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char str1[5010],str2[5010];
int dp[5010][5010];
int w[3];
int main(){
    while(scanf("%s %s",str1,str2)!=EOF){
        int len1=strlen(str1);
        int len2=strlen(str2);
        fill(dp[0],dp[0]+5010*5010,0);
        dp[0][0]=0;
        for(int i=1;i<=3;++i){
            scanf("%d",&w[i]);
        }
        for(int i=1;i<=len2;++i){
            dp[0][i]=w[1]*i;
        }
        for(int i=1;i<=len1;++i){
            dp[i][0]=w[2]*i;
        }
        for(int i=1;i<=len1;++i){
            for(int j=1;j<=len2;++j){
                if(str1[i-1]==str2[j-1])
                    dp[i][j]=dp[i-1][j-1];
                else{
                    dp[i][j]=dp[i-1][j-1]+w[3];
                }
                dp[i][j]=min(dp[i][j-1]+w[1],min(dp[i-1][j]+w[2],dp[i][j]));
            }
        }
        printf("%d\n",dp[len1][len2]);
    }
}


编辑于 2020-05-09 15:23:35 回复(0)
1
发表于 2020-05-06 14:55:36 回复(0)