#include #include #include int N; int A[100]; // [位置][前に選んだ位置] (前に選んだ位置がない場合は100とする) int dp[100][101], dp2[100][101], mx[100], mx2[100]; void makeDP(int (&dp)[100][101], int (&mx)[100], std::function indexing){ memset(dp, 0, sizeof(dp)); memset(mx, 0, sizeof(mx)); dp[indexing(0)][100] = 1; mx[indexing(0)] = 1; for(int _i=1;_i= A[k] || A[k] >= A[i] || A[k] - A[j] >= A[i] - A[k]){ continue; } dp[i][k] = std::max(dp[i][k], dp[k][j] + 1); mx[i] = std::max(mx[i], dp[i][k]); } } } } void showDP(const int (&dp)[100][101]){ for(int i=0;i