题意:给你正确的第i个事件的时间是第a[i]时发生,然后给出学生的答案,问你先后时间最多的顺序个数是多少
思路:利用dp中的最长上升子序列解题,我们可以得到状态方程
dp[i][j]=dp[i-1][j-1]+1 (a[i]==b[j])
dp[i][j]=max(dp[i-1][j],dp[i][j-1]) (a[i]!=b[j])
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; const int maxn=200; int main(int argc, char const *argv[]) { int n,m; int data[maxn],num[maxn],dp[maxn][maxn]; while(cin>>n) { int a; for(int i=1;i<=n;i++) { cin>>a; data[a]=i; } while(cin>>a) { num[a]=1; for(int i=2;i<=n;i++) { cin>>a; num[a]=i; } memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(data[i]==num[j]) { dp[i][j]=dp[i-1][j-1]+1; } else { dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } } cout<<dp[n][n]<<endl; } } return 0; }