zoukankan      html  css  js  c++  java
  • 求逆序对 && 逆序对数列

     如果是搜索的话,不好记录逆序对的个数,其实无论怎样,逆序对的个数都不好计算

    1~n的排列 除了n!的暴力外,很大概率上是动态规划(把数从小到大一个一个插入进去的过程)
    

    f[i][j]表示插完了第i个数,逆序对数是几

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cmath>
     6 using namespace std;
     7 const int maxn=107;
     8 const int mod=10000; 
     9 int n,K;
    10 int f[maxn][maxn*maxn];
    11 int main(){
    12   cin>>n>>K;
    13   f[0][0]=1;
    14   for(int i=1;i<=n;i++){
    15     for(int j=0;j<=K;j++){
    16       for(int k=0;k<=i-1&&j-k>=0;k++){
    17         f[i][j]+=f[i-1][j-k];f[i][j]%=mod;
    18       }
    19     }
    20   }
    21   cout<<f[n][K]%mod<<endl;
    22 } 

    前缀和优化:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cmath>
     6 using namespace std;
     7 const int maxn=1007;
     8 const int mod=10000; 
     9 int n,K;
    10 int f[maxn][maxn],sum[maxn][maxn];
    11 int main(){
    12   cin>>n>>K;
    13   f[0][0]=1;
    14   for(int i=1;i<=n;i++){
    15       sum[i][0]=1;
    16     for(int j=1;j<=K;j++){
    17       f[i][j]=sum[i-1][j];f[i][j]%=mod;
    18       if(j-i+1>0) f[i][j]-=sum[i-1][j-i];f[i][j]=(f[i][j]%mod+mod)%mod;
    19       sum[i][j]=sum[i][j-1]+f[i][j];sum[i][j]%=mod;
    20     }
    21   }
    22   cout<<f[n][K]%mod<<endl;
    23   return 0;
    24 } 
  • 相关阅读:
    HDU 3466(01背包变种
    HDU 2639(01背包第K大)
    POJ 2184(01背包)(负体积)
    UVA 562(01背包)
    UVA 624(01背包记录路径)
    SQL总结二
    oracle--知识点汇总1
    时间日期----java
    字符串、数值----转换
    字符串反转----示例
  • 原文地址:https://www.cnblogs.com/lcan/p/9898465.html
Copyright © 2011-2022 走看看