最大数字题解好难理解https://www.lanqiao.cn/problems/2193/learning/
#include <bits/stdc++.h>
using namespace std;
int T[15],D[15],L[15];
int n;
int vis[15],ans;
void dfs(int plane,int time){
if(plane==n){ //n架飞机都安排好了能降落
ans=1;
return;
}
for(int i=0;i<n;i++){
if(!vis[i] && time<=T[i]+D[i]){ //剪枝
int t = time; //t:安排给飞机i的降落时间
if(t<T[i]) t=T[i]; //飞机i还没到,只能等它
vis[i]=1;
dfs(plane+1,t+L[i]);
vis[i]=0;
}
}
}
int main(){
int m; cin >>m; //m是测试组数
while(m--){
cin >> n;
for(int i=0;i<n;++i) cin >> T[i] >> D[i] >> L[i];
ans = 0;
dfs(0,0);
if(ans) cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}
给的代码是不是有问题?T_T
测试用例 123 1 2 表示初始的字符串数字是 123,第一种操作剩余次数为 1,第二种操作剩余次数为 2。
递推过程如下:
起始状态:
字符串 s: "123"
操作1剩余次数 A: 1
操作2剩余次数 B: 2
当前位 i: 0(从最高位开始)
当前累积值 v: 0
第1步:处理最高位('1')
第1位数字 d: 1
第1种操作次数 t: min(1, 9-1) = 1(因为只能操作一次)
更新 A: 1 - 1 = 0
递归调用 dfs(1, 010 + 1 + 1): 处理下一位,当前累积值为 2
恢复 A: 0 + 1 = 1
检查操作2:因为 B > d,执行操作2
更新 B: 2 - (1 + 1) = 0
递归调用 dfs(1, 010 + 9): 处理下一位,当前累积值为 9
恢复 B: 0 + (1 + 1) = 2
第2步:处理第二位('2')
(从第一个递归调用返回,此时累积值为2,处理下一位 '2')
第2位数字 d: 2
第1种操作次数 t: min(0, 9-2) = 0(因为已经没有操作1的次数了)
直接递归调用 dfs(2, 2*10 + 2): 处理下一位,当前累积值为 22
(从第二个递归调用返回,此时累积值为9,处理下一位 '2')
第2位数字 d: 2
第1种操作次数 t: min(1, 9-2) = 1(因为还有1次操作1的次数)
更新 A: 1 - 1 = 0
递归调用 dfs(2, 910 + 2 + 1): 处理下一位,当前累积值为 93
恢复 A: 0 + 1 = 1
检查操作2:因为 B > d,执行操作2
更新 B: 2 - (2 + 1) = -1(这里 B 已经为负数,但代码中没有做这样的检查)
递归调用 dfs(2, 910 + 9): 处理下一位,当前累积值为 99
恢复 B: -1 + (2 + 1) = 2
第3步:处理第三位('3')
(从第一个递归调用返回,此时累积值为22,处理下一位 '3')
第3位数字 d: 3
第1种操作次数 t: min(0, 9-3) = 0(已经没有操作1的次数了)
直接递归调用 dfs(3, 22*10 + 3): 处理下一位,但字符串结束,所以直接更新答案
(从第二个递归调用返回,此时累积值为93,处理下一位 '3')
第3位数字 d: 3
第1种操作次数 t: min(0, 9-3) = 0(已经没有操作1的次数了)
直接递归调用 dfs(3, 93*10 + 3): 处理下一位,但字符串结束,所以直接更新答案
(从第三个递归调用返回,此时累积值为99,处理下一位 '3')
第3位数字 d: 3
第1种操作次数 t: min(0, 9-3) = 0(已经没有操作1的次数了)
直接递归调用 dfs(3, 99*10 + 3): 处理下一位,但字符串结束,所以直接更新答案,
?所以谁知道到底怎么推啊,太难理解了T_T