和基础课类似
#include<bits/stdc++.h>
using namespace std;
const int N=10,M=1<<N;
int f[M][N],d[N],t[N],l[N];//f[i][j]表示用到的飞机为i且末尾飞机为j且最早何时能降落完成
int T,n;
int main()
{
cin>>T;
while(T--)
{
cin>>n;
for(int i=0;i<n;i++) cin>>t[i]>>d[i]>>l[i];
memset(f,0x3f,sizeof f);
for(int i=0;i<n;i++)//初始化,只用了一个飞机,末尾飞机就是本身
{
int tt=(1<<i);
f[tt][i]=t[i]+l[i];
}
for(int i=0;i<(1<<n);i++)//枚举所有状态
for(int j=0;j<n;j++)//枚举末位j
{
if((i>>j)&1)//i中存在j
{
int tt=i-(1<<j);//i-j的状态
for(int k=0;k<n;k++)//枚举i-j的状态末尾k
{
if((tt>>k)&1)//i-j的状态里面必须包含k
{
if(t[j]+d[j]<f[tt][k]) continue;//j无法在k之后降落
f[i][j]=min(f[i][j],max(f[tt][k],t[j])+l[j]);
}
}
}
}
int res=f[(1<<n)-1][0];
for(int k=0;k<n;k++)
{
res=min(res,f[(1<<n)-1][k]);
}
if(res==0x3f3f3f3f) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
//cout<<f[M-1]<<endll
}
}