早上
写了套div2,4题下训。。
下午
多校三题签完到开始挂机,后面的题目基本都写不动。。。。
这两场hdu好像都是这样。。。
不过这场三题都是队友写的,开始挂机之后我还在调签到的bug
晚上
有点不想补这场的题了。。。题解都看得费劲。。。
新东西又学不动,题也补不动
去不了下上会那个掉大分的div3
e题2000分dp 自己分析了会 然后码了下 竟然过了,哈哈哈哈哈哈挺开心的。。
作为dp白痴的我竟然把这题秒了哈哈哈哈
Codeforces Round #734 (Div. 3) E. Fixed Points
题目思路
设dp[i][j]表示前i个数删了j个后匹配上的位置个数
转移方程如下
d
p
[
i
]
[
j
]
=
m
a
x
(
d
p
[
i
−
1
]
[
j
−
1
]
+
(
i
−
j
=
=
a
[
i
]
)
)
dp[i][j]=max(dp[i-1][j-1]+(i-j==a[i]))
dp[i][j]=max(dp[i−1][j−1]+(i−j==a[i]))
ac代码
const int maxn = 2e3+10;
const int inf = 1e9+10;
const ll llinf =1e18+10;
const ll mod = 1e9+7;
int a[maxn];
int dp[maxn][maxn],b[maxn];
int main()
{
int _,cas=0;
scanf("%d",&_);
while(_--)
{
int n,m;
scanf("%d%d",&n,&m);
int cnt=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=i-a[i];
if(b[i]>=0)
cnt++;
}
if(cnt<m)
printf("-1\n");
else
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dp[i][j]=0;
int ans=inf;
for(int i=1;i<=n;i++)
{
dp[i][0]=dp[i-1][0]+(a[i]==i);
if(dp[i][0]>=m)
ans=0;
}
for(int j=1;j<=n;j++)
{
for(int i=1;i<=n;i++)
{
dp[i][j]=max(dp[i-1][j-1],dp[i-1][j]+(i-j==a[i]));
if(dp[i][j]>=m)
ans=min(ans,j);
}
}
if(ans==inf)
printf("-1\n");
else
printf("%d\n",ans);
}
}
}