UVA - 12983 The Battle of Chibi(树状数组+DP)
HDU - 5542 The Battle of Chibi(树状数组+DP)
#include<cstdio>#include<cstring>#include<algorithm>#include<vector>using namespace std;const int N = 1010, MOD = 1e9 + 7;int n,m,a[N],tr[N],f[N][N];void add(int x,int v){for(int i=x;i<=n;i+=(i&-i))tr[i]=(tr[i]+v)%MOD;}int sum(int x){int res=0;for(int i=x;i>0;i-=(i&-i))res=(res+tr[i])%MOD;return res;}int main(){int T;scanf("%d",&T);for(int C=1;C<=T;C++){vector<int> nums;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&a[i]);nums.push_back(a[i]);}sort(nums.begin(),nums.end());nums.erase(unique(nums.begin(),nums.end()),nums.end());for(int i=1;i<=n;i++)a[i]=lower_bound(nums.begin(),nums.end(),a[i])-nums.begin()+1;for(int i=1;i<=n;i++) f[i][1]=1;for(int j=2;j<=m;j++){for(int i=1;i<=n;i++) tr[i]=0;for(int i=1;i<=n;i++){f[i][j]=sum(a[i]-1);add(a[i],f[i][j-1]);}}int res=0;for(int i=1;i<=n;i++) res=(res+f[i][m])%MOD;printf("Case #%d: %d\n",C,res);}return 0;}