假设有三个进程P1、P2、P3共享某类资源, 它们的最大需求资源数分别为(10、4、9), 该类资源的总数为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<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]); } }