n = int(input())
dict = {'I': 1, 'IV': 4, 'V': 5, 'IX': 9, 'X': 10, 'XL': 40, 'L': 50, 'XC': 90, 'C': 100, 'CD': 400, 'D': 500,
'CM': 900, 'M': 1000}
for i in range(n):
ans = 0
exp = input()
if exp[:2] in dict:
ans += dict[exp[:2]]
for j in exp[2:]:
ans += dict[j]
print(ans)
else:
for j in exp:
ans += dict[j]
print(ans)
思路:穷举
l, r = map(int, input().split())
ans = 0
for i in range(l, r + 1):
ans += str(i).count('2')
print(ans)
n = int(input())
exp = list(input().split())
for i in range(n):
exp[i] = int(exp[i])
exp.sort()
ans = 0
for i in range(2,n+1):
ans += sum(exp[0:i])
print(ans)
from itertools import *
n = input()
exp = []
pe=[]
for i in range(len(n)):
exp.append(n[i])
pe.append(n[i])
exp.sort()
res = [i for i in range(len(exp))]
count = 0
for elemt in permutations(exp):
if list(elemt) == pe:
print(count)
break
count += 1
#状态计算的定义:
#dp[i+1][j+1]=dp[i][j+1]表示s的前i个字符包含了t的前j个字符
#dp[i+1][j+1]=dp[i][j]表示s[i]和t[j]相等
#dp[i+1][j+1]=dp[i][j]+1表示不相同进行一步修改
s = input()
t = input()
dp = [[9999] * (len(t) + 1) for i in range(len(s) + 1)]#创建一个len(s)+1行,len(t)+1列的矩阵,因为要求最小值所以把矩阵的值都取最大
for i in range(len(s) + 1):
dp[i][0] = 0#dp[i][0]代表s的前i个字符包含t的前0个字符的操作数,t的前0个字符即空串,因为空串是任意串的子串,不需要进行更改操作,所以操作数为0
#f[0][j]代表s的前0个字符包含t的前j个字符的操作数,因为s的前0个字符即空串,空串无论怎么修改任然是空串,因此应该赋值为正无穷,但此前我们已经对所有的dp 赋值了正无穷,因此此步可省略
for i in range(len(s)):
for j in range(len(t)):
if s[i] == t[j]:#s[i]等于t[j],则dp[i+1][j+1]等于dp[i][j],因为不需要进行任何操作
dp[i+1][j+1] = dp[i][j]
else:#s[i]不等于t[j],则dp[i+1][j+1]等于dp[i][j]+1和dp[i][j+1]中的较小值,表示替换或删除操作的最小操作数。
dp[i+1][j+1] = min(dp[i][j]+1, dp[i][j+1])
print(dp[-1][-1])
初始化dp和dp状态定义很重要