标签:结束 stream alt ret color ace 条件 pen space
总结:1. f[a][b]=c,当b过大的时候,可以把b c换个位置填表,在返回找满足条件的最大的c,
2.写dp问题的时候,初始话和边界条件一定要注意再注意,小心再小心!!!
此题的f初始化为-INF,在转移过程出现负数是不合法的,
尤其注意在状态转移的过程中,状态转移方程触碰的边界是否需要初始化!!!
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 using namespace std; 5 6 const int INF=0x3f3f3f3f; 7 const int maxn=1e3+5; 8 long long f[maxn][maxn], a[maxn], b[maxn], c[maxn]; 9 10 int main() 11 { 12 //freopen("in.txt", "r", stdin); 13 int T; cin>>T; 14 while(T--) 15 { 16 int n,s; cin>>n>>s; 17 for(int i=1; i<=n; i++) 18 cin>>a[i]>>b[i]>>c[i]; 19 20 memset(f, -0x3f, sizeof(f));//状态转移过程中出现负数是不合法的,且取max,故初始化为-INF 21 f[0][0]=s; //注意边界的初始化 22 for(int i=1; i<=n; i++) 23 { 24 f[i][0]=f[i-1][0]+c[i]; //注意边界的初始化,千万别弄丢了!!! 25 for(int j=1; j<=n; j++) 26 { 27 long long t1=f[i-1][j]+c[i]; //不选 28 long long t2=min(f[i-1][j-1], b[i])-a[i]; //选 29 if(t2>0) 30 f[i][j]=max(t1, t2+c[i]); 31 else 32 f[i][j]=t1; 33 } 34 } 35 36 int ans=0; 37 for(int j=n; j>=0; j--) 38 if(f[n][j]>0){ 39 ans=j; break; 40 } 41 cout<<ans<<endl; 42 } 43 return 0; 44 }
标签:结束 stream alt ret color ace 条件 pen space
原文地址:https://www.cnblogs.com/Yokel062/p/10771687.html