• NOI-动规题目集锦


     162:Post Office

    解题思路

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,a[1001],f[500][500],mi[500][500],i,j;
    int main()
    {
        cin>>n>>m;
        for(i=1;i<=n;i++)cin>>a[i];
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
                f[i][j]=9999999;//赋为最大值
        for(i=1;i<=n;i++)
        {
            for(j=i+1;j<=n;j++) mi[i][j]=mi[i][j-1]+a[j]-a[(i+j)/2];//从第i个村庄到第j个村庄中只建一个邮局的总路径长度 
            f[i][1]=mi[1][i];//转移到f 
        }
        for(i=2;i<=n;i++)
            for(j=2;j<=m;j++)
                for(int k=j-1;k<i;k++)
                    f[i][j]=min(f[i][j],f[k][j-1]+mi[k+1][i]);
        cout<<f[n][m]<<endl;
        return 0;
    }
    View Code

    1759:最长上升子序列

    #include<iostream> 
    #include<cstring>
    using namespace std;
    const int N = 1050;
    int a[N],f[N];
    
    int main()
    {
        int n;
        cin>>n;
        for(int i=0;i<n;i++)cin>>a[i];
        for(int i=0;i<n;i++)f[i]=1;
        for(int i=1;i<n;i++)
        {
            for(int j=0;j<i;j++)
            {
                if(a[j]<a[i])f[i]=max(f[i],f[j]+1);
            }
        }
        int ans = 1;
        for(int i=0;i<n;i++)ans = max(ans,f[i]);
        cout<<ans<<endl;
        return 0;
    }
    View Code

    1768:最大子矩阵

    讲解链接

    2000:最长公共子上升序列

    讲解链接:原理解释 题目解答

    /* 
       1. 这题不支持Special Judge...so设置状态转移方程的时候 要设置成LCIS是以第一个数组的第j个元素结尾的 而不能是第二个数组 - - 就是这么坑0-0 
       2. 记录LCIS中的元素并输出 dp的时候对结构体dp  结构体中vector记录LCIS中元素。 
     */  
    #include<iostream>  
    #include<vector>  
    using namespace std;
    
    struct Node 
    {  
        int val = 0;  
        vector<int>v;  
    };  
    
    int main() {  
        int a[501], b[501];  
        Node dp[501];  
        int m, n;  
        cin >> m;  
        for (int i = 1; i <= m; i++)  
            cin >> a[i];  
        cin >> n;  
        for (int i = 1; i <= n; i++)  
            cin >> b[i];  
        for (int i = 1; i <= n; i++)  
        {  
            Node Max;  
            for (int j = 1; j <= m; j++) {  
                if (b[i] > a[j] && dp[j].val > Max.val)  
                    Max = dp[j];  
                if (b[i] == a[j]) {  
                    dp[j].val = Max.val + 1;  
                    dp[j].v = Max.v;  
                    dp[j].v.push_back(b[i]);  
                }  
            }  
        }  
        Node Max = dp[1];  
        for (int i = 2; i <= m; i++) {  
            if (dp[i].val > Max.val)  
                Max = dp[i];  
        }  
        cout << Max.val << endl;  
        for (int i = 0; i < Max.v.size(); i++)  
            cout << Max.v[i] << " ";  
        cout << endl;  
        return 0;  
    }  
    View Code

    2985:数字组合

    讲解链接

    #include<iostream>
    #include<cstring>
    using namespace std;
    
    int main() 
    {
        int n,t;
        int f[1005],a[22];
        cin>>n>>t;
        for(int i=1;i<=n;i++)cin>>a[i];
        f[0]=1;
        for(int i=1;i<=n;i++)
            for(int j=t;j>=a[i];j--)
                f[j]+=f[j-a[i]];
        cout<<f[t]<<endl;
        return 0;
    }
    View Code
  • 相关阅读:
    C++各大有名库的介绍——网络通信
    C++名人的网站
    C++各大有名库的介绍——序列化
    C++各大有名库的介绍——字符串
    C++各大有名库的介绍——游戏开发
    C++各大有名库的介绍——其他库
    C++各大有名库的介绍——综合
    java hashcode写法
    vs 在线引用
    eclipse去掉拼写检查
  • 原文地址:https://www.cnblogs.com/yun-an/p/11477893.html
Copyright © 2020-2023  润新知