1. 程式人生 > >luogu p1799 數列_NOI導刊2010提高(06)

luogu p1799 數列_NOI導刊2010提高(06)

tps else return include .org 沒有 個數 ble 提高

原題鏈接

https://www.luogu.org/problem/show?pid=1799

我一開始覺得這個題真是玄學,直到我發現自己沒有寫max之後。。。(逃)

f[i][j]表示前i個刪了j個時的最優解,對於第i個數,如果前面刪去j個數時,能使a[i]==i,f[i][j]的值就會增加1;

但這樣是不是就是最大了呢,不一定。如果此時f[i-1][j-1]很大的話,f[i-1][j]+1仍然較小,此時就不如不刪除。

不管刪去j的數後能否使a[i]==i,f[i][j]都等於f[i-1][j-1]與f[i-1][j]的較大值。

代碼挺短的,但是就是忘寫max引發的血案。。。

#include<cstdio>
int
max(int x,int y) { if(x>y) return x; else return y; } int n,ans,a[1005],f[1005][1005]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); for(int j=0;j<i;j++) { if(a[i]==i-j) f[i][j]=max(f[i-1][j-1],f[i-1][j]+1);
else f[i][j]=max(f[i-1][j-1],f[i-1][j]); } } for(int i=0;i<n;i++) ans=max(f[n][i],ans); printf("%d",ans); return 0; }

luogu p1799 數列_NOI導刊2010提高(06)