精华内容
下载资源
问答
  • 方格取数 给你一个nn的格子的棋盘,每个格子里面有一个非负数。 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大。...75 15 28 ...

    方格取数

    给你一个nn的格子的棋盘,每个格子里面有一个非负数。
    从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大。
    Input
    包括多个测试实例,每个测试实例包括一个整数n 和n
    n个非负数(n<=20)
    Output
    对于每个测试实例,输出可能取得的最大的和
    Sample Input

    3
    75 15 21 
    75 15 28 
    34 70 5 
    

    Sample Output

    188
    

    代码:

    #include<bits/stdc++.h>
    
    
    using namespace std;
    int aa[25][25];
    int dp[25][20000];
    int st[20000];
    
    int main()
    {
        int n;
        while(cin>>n)
        {
            memset(dp,0,sizeof(dp));
            for(int i=1; i<=n; i++)
                for(int j=0; j<n; j++)
                    cin>>aa[i][j];
    
            int tot=0;
            for(int i=0; i<=1<<n; i++)
                if((i&i<<1)==0)
                    st[tot++]=i;
            for(int i=1; i<=n; i++)
            {
                for(int j=0; j<tot; j++)
                {
                    for(int k=0; k<tot; k++)
                    {
                        if(st[j]&st[k])
                            continue;
                        int s=0;
                        for(int q=0; q<n; q++)
                            if((st[k]&1<<q)!=0)    s+=aa[i][q];
    
                        dp[i][j]=max(dp[i][j],dp[i-1][k]+s);
                    }
                }
            }
            int ans=0;
            for(int i=0; i<tot; i++)    ans=max(dp[n][i],ans);
            cout<<ans<<endl;
        }
        return 0;
    }
    
    
    展开全文
  • <p>This is in my sway config, DP-4 and DP-5 are the monitors that are not turning on: <pre><code> set $monitor-center "DP-1" set $monitor-right "DP-4" set $monitor-left "DP-5" ...
  • 文章目录A.NEFU_OJ:摘花生-DP 路漫漫其修远兮,吾将上下而求索。 dp,倒着推思路,正着写代码。 A.NEFU_OJ:摘花生-DP 思路:本题是经典的动态规划,由题意可知只能向右走或者向下走;所以根据上一篇dp文章提到的思维...


    路漫漫其修远兮,吾将上下而求索。
    dp,倒着推思路,正着写代码。


    A.NEFU_OJ:摘花生-DP

    思路:本题是经典的动态规划,由题意可知只能向右走或者向下走;所以根据上一篇dp文章提到的思维,很显然当走到右下角时,其花生总和要考虑是从上面走下来的还是从左边走过来的。以这个子问题进行类推,对于最优解的每一步都要考虑这个问题,于是得到状态转移方程f[i][j]+=max{f[i-1][j],f[i][j-1]}(i>1&&j>1)。
    除此之外显然当位于第一行或者第一列时,只能从左边或者上面的路走到,所以进行边界判断。

    #include <bits/stdc++.h>
    using namespace std;
    int T, row, column;
    int f[200][200];
    int main()
    {
        cin >> T;//组数
        while (T--)
        {
            cin >> row >> column;
            for (int i = 1; i <= row; i++)
                for (int j = 1; j <= column; j++)
                    cin >> f[i][j];
            for (int i = 1; i <= row; i++)
                for (int j = 1; j <= column; j++)
                {
                    if (i == 1)
                        f[i][j] += f[i][j - 1];//边界
                    else if (j == 1)
                        f[i][j] += f[i - 1][j];//边界
                    else
                        f[i][j] += max(f[i - 1][j], f[i][j - 1]);
                }
            printf("%d\n", f[row][column]);
        }
        //system("pause");
        return 0;
    }
    

    B.NEFU_OJ:登山-DP

    本题需要有 最长上升子序列 (LIS)最长下降子序列(LDS) 的前置知识。
    这里用的是dp求lis。

    👉这里是一篇写的还不错的LIS详解!

    思路:按照题意,即求位于i位置时,i左边的LIS长度和i右边LDS长度之和最大。所以我们正序求得每个位置的LIS长度,再倒序(一定要是倒序,因为要求“开始下降后一直下降”表明了i的右边是LDS)求LDS的长度,最后相加找最大值即可。
    不要忘记答案-1!因为i位置在LIS、LDS中算了两次!

    #include <bits/stdc++.h>
    using namespace std;
    int val[1010], lis[1010], lds[1010];
    int main()
    {
        int n;
        cin >> n;
        for (int i = 1; i <= n; i++)//输入与初始化
        {
            cin >> val[i];
            lis[i] = 1, lds[i] = 1;
        }
        for (int i = 2; i <= n; i++)//正序求lis长度
            for (int j = 1; j < i; j++)
                if (val[i] > val[j])
                    lis[i] = max(lis[i], lis[j] + 1);
        for (int i = n - 1; i >= 1; i--)//倒序求lds长度
            for (int j = i + 1; j <= n; j++)
                if (val[i] > val[j])
                    lds[i] = max(lds[i], lds[j] + 1);
        int max = 0;
        for (int i = 1; i <= n; i++)//求最大值
            if (max < lis[i] + lds[i] - 1)
                max = lis[i] + lds[i] - 1;
        cout << max << endl;
        //system("pause");
        return 0;
    }
    

    C.NEFU_OJ:导弹拦截-DP

    也是很经典的一道题,这里用的也是dp(O(n^2))来求解

    👉洛谷有二分+贪心和树状数组(都是O(nlogn))的题解

    关于本题:
    问一是要求最长 不上升 子序列的长度(即<=);
    问二是要求最长 上升 子序列的长度(>);

    为什么?

    👉dilworth定理

    Dilworth定理:对于一个偏序集,最少链划分等于最长反链长度。
    Dilworth定理的对偶定理:对于一个偏序集,其最少反链划分数等于其最长链的长度。

    所以在本题中,求最长不上升子序列的个数意思就是用相对最长不上升子序列来划分原序列,就等于求原序列的最长上升子序列的长度

    O(n^2)的代码如下:

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 1010;
    int val[N], n = 1, lds[N], lis[N];
    int main()
    {
        while (cin >> val[n])//输入以及初始化
            lis[n] = 1, lds[n] = 1, n++;
        n--;
        for (int i = 2; i <= n; i++)
            for (int j = 1; j < i; j++)
            {
                if (val[i] <= val[j])//求最长不上升子序列长度
                    lds[i] = max(lds[i], lds[j] + 1);
                else//求最长上升子序列长度
                    lis[i] = max(lis[i], lis[j] + 1);
            }
        int ans_1 = 0, ans_2 = 0;
        for (int i = 1; i <= n; i++)//必要的一步,找到最长的长度
            ans_1 = max(ans_1, lds[i]), ans_2 = max(ans_2, lis[i]);
        cout << ans_1 << endl
             << ans_2 << endl;
        //system("pause");
        return 0;
    }
    

    D.NEFU_OJ:城市交通网-DP

    难死我了(捂脸)
    题目看了好一会才看懂说的是什么意思(小白表示很难受)

    这题的给的矩阵如str[i][j]=x,表示从城市i到城市j的费用为x题面看的我想打人
    在这里插入图片描述
    如示例:
    从v1到v3 → (1,3),费用为5;
    从v3到v5 → (3,5),费用为6;
    从v5到v8 → (5,8),费用为3;
    从v8到v10 → (8,10),费用为5;
    所以共计minlong=19。

    要是别的博客像本小白解释的一样清楚就好了,大佬的看不懂啊

    其他注意点:

    👉关于用0x3f3f3f3f代表无穷大及其好处

    另外:
    像这种求最小值,状态转移方程一般需要初始化为无穷大;
    同理求最大值,一般需要初始化为一个负值或较小的值。

    上代码:

    #include <bits/stdc++.h>
    using namespace std;
    #define max 110
    int n, str[max][max], f[max], pre[max];//f存从vi到v10的最少费用,pre[i]=x表示i的后缀节点为x!
    int main()
    {
        cin >> n;
        memset(f, 0x3f, sizeof(f));//对f进行初始化(0x3f3f3f3f可以用memset按此写法赋值)
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
                cin >> str[i][j];
        f[n] = 0;
        for (int i = n - 1; i >= 1; i--)
            for (int j = i + 1; j <= n; j++)
                if ((str[i][j] > 0) && (f[j] != 0x3f3f3f3) && (f[i] > str[i][j] + f[j]))
                //如果vi到vj可走,vj到v10可走,并且vi直接到v10的路径费用>vi→vj→v10的路径费用
                    f[i] = str[i][j] + f[j], pre[i] = j;//更新f中记录的vi到v10最少费用,并记录路径点
                //因为本题要记录路径,所以这里不能把if的最后一个判断去掉,写成f[i]=min(f[i],str[i][j]+f[j]),
                //虽然这样记录的从vi到v10的最少费用没错,但多次进入if会导致pre记录的点发生改变!
        cout << "minlong=" << f[1] << endl;
        int k = 1;
        while (k != 0)//模拟循环链表
            k == 1 ? cout << k : cout << " " << k, k = pre[k];
        cout << endl;
        //system("pause");
        return 0;
    }
    

    E.NEFU_OJ:求最长不下降序列-dp

    这题问一并没有难度,主要是如何考虑问二如何找到最靠左的最长上升子序列并输出路径

    直接上代码:

    #include <bits/stdc++.h>
    using namespace std;
    int n, mx, k, str[210], lis[210], ans[210], cnt;
    int main()
    {
        cin >> n;
        for (int i = 1; i <= n; i++)
            cin >> str[i], lis[i] = 1;
        for (int i = 2; i <= n; i++)
            for (int j = 1; j < i; j++)
            {
                if (str[j] < str[i])
                    lis[i] = max(lis[i], lis[j] + 1);
                if (mx < lis[i])//保存最大长度,并记录最长子序列尾元素
                    mx = lis[i], k = i;
            }
        cout << "max=" << mx << endl;
        ans[++cnt] = str[k];//保存尾元素
        for (int i = mx - 1; i >= 1; i--)//长为mx,保存了队尾还剩mx-1个元素
            for (int j = 1; j <= n; j++)//保证是找最靠左的
            {
                if (lis[j] == i && str[j] < ans[cnt])//当j位置的lis[j]值等于i时(当前长度相等)且j元素<其下一个元素
                {
                    ans[++cnt] = str[j];//保存j
                    break;//保存了一定马上退出,保证保存的是最靠左的!
                }
            }
        for (int i = cnt; i >= 1; i--)//倒序输出即可
            cout << ans[i] << " ";
        //system("pause");
        return 0;
    }
    
    展开全文
  • 28cb0cb25701a242d84c2857fdf52775" </code></pre> <p>or <pre><code> "hash":{ "md5":"28cb0cb25701a242d84c2857fdf52775", "sha256":"..." } </code></pre> ...
  • Proceedings of the ACM Conference on Computer and Communications Security, 24-28-Octo(Ccs), 308–318. https://doi.org/10.1145/2976749.2978318</p><p>该提问来源于开源项目:tensorflow/privacy</p>...
  • ZWG-28DP高性能GPRS/SMS数传模块推荐应用电路pdf,ZZWG-28DP是一款GPRS嵌入式模块,它具有小巧的体积和灵活的应用方式,可以非常方便的嵌入到用户的设备中,使您的设备同时具有GPRS和SMS功能,它非常易于使用。ZWG-28...
  • ZWG-28DP高性能GPRS/SMS数传模块用户手册pdf,ZWG-28DP GPRS DTU是广州致远电子有限公司出品的一款嵌入式DTU 模块。它具有小巧的体积和灵活的应用方式,可以非常方便的嵌入到用户的设备中,使您的设备具有GPRS无线...
  • ZWG-28DP高性能GPRS/SMS数传模块快速使用手册pdf,该文档主要介绍了ZWG-28DP高性能GPRS/SMS数传模块快速使用的步骤:检查模块的连接线是否松动,打开设备包装盒,首先GPRS模块与底板之间的排线连接是否正常。...
  • 题目地址 http://codeforces.com/problemset/problem/28/C 代码+注释 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; //前i个...

    题目地址 http://codeforces.com/problemset/problem/28/C

    代码+注释

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    using namespace std;
    //前i个澡堂,一共j个人,最长队伍为k的概率
    //dp[i][j][k]
    double dp[55][55][100];
    int a[55];
    double C[55][55];
    void init() {
        C[0][0] = 1;
        for ( int i = 1; i <= 50; i++ )
        {
            C[i][0] = 1;
            for (int j = 1; j <= i; j++)
                C[i][j] = C[i-1][j-1] + C[i-1][j];
        }
    }
    int main()
    {
        int m,n;
        scanf("%d%d",&n,&m);
        init();//求组合数
        memset(dp,0,sizeof(dp));
        for ( int i = 1; i <= m ; i++ )  scanf("%d",&a[i]);
        dp[0][0][0] = 1; // dp初始化
        for (int i = 1 ; i <= m; i++)
        {
           for (int j = 0; j <= n ; j++)
           {
                for ( int k = 0; k <= n; k++)
                {
                    //枚举[i][j][k]
                    //计算dp[i][j][k]
                    int top = min(k*a[i],j);
                    //只有当前澡堂最长队伍小于等于k时。才能转移
                    for (int c = 0 ; c <= top ; c++) //i澡堂中人数
                    {
                        if (k*a[i]-a[i]+1 > c) // 如果当前 澡堂最大值不是k 只能从dp[i-1][j-c][k]转移
                            dp[i][j][k] += dp[i-1][j-c][k] * pow(i-1,j-c)  / pow(i,j) * C[j][c];
                        else // 如果当前为k,可以从 dp[i-1][j-c][<=K]转移
                             for (int tt = 0; tt<=k ;tt++)
                                dp[i][j][k] += dp[i-1][j-c][tt] * pow(i-1,j-c)  / pow(i,j)* C[j][c];
                    }
                }
           }
        }
        double  ans = 0;
        for (int i = 1 ; i <= n; i++)
        {
           ans += dp[m][n][i] * i;
        }
        printf("%.10f\n",ans);
        return 0;
    }

     

    转载于:https://www.cnblogs.com/HITLJR/p/5971680.html

    展开全文
  • DP 1881 (2011-2-28 19:40)

    千次阅读 2012-07-13 21:57:33
    ++i) //dp  for(j=1;j[n].t;++j)   if(j>=bg[i].l&&j[i].t&&f[i-1][j-bg[i].l]+bg[i].h>f[i-1][j])   f[i][j]=f[i-1][j-bg[i].l]+bg[i].h;   else   f[i][j]=f[i-1][j];   int ans=f[n][1];...

    //准确的说,这是一道加强的0-1背包问题

    //这到题多了个上限和下限

    //把离开时间当作重量,快乐度当作价值,所需时间当作条件

    //l为下限,t为上限

    //东西有先后之分,所以先排序

    //状态转移方程

    //f[i][j]=max{ f[i-1][j-bg[i].l]+bg[i].h , f[i-1][j] | j>=bg[i].l,j<=bg[i].t }

    #include<stdio.h>  
    struct node   
    {   
        int h,l,t;   
    };   
    node bg[31],temp;   
    int f[31][1000];   
      
    int main()   
    {   
        int n;   
        while(scanf("%d",&n)!=EOF && n>=0)   
        {   
            int i,j,k;   
            for(i=1;i<=n;++i)   
               scanf("%d%d%d",&bg[i].h,&bg[i].l,&bg[i].t);   
               
           for(i=1;i<n;i++){
            k=i;
       for(j=i+1;j<=n;j++){
        if(bg[j].t<bg[k].t){
         k=j;
        }
       }
       if(k!=i){
       temp=bg[i];bg[i]=bg[k];bg[k]=temp;
       }
      } //排序 
            for(i=0;i<=n;++i)   
                f[i][0]=0;   
            for(i=0;i<=bg[n].t;++i)   
                f[0][i]=0;   
                
            for(i=1;i<=n;++i)   //dp
                for(j=1;j<=bg[n].t;++j)   
                    if(j>=bg[i].l&&j<=bg[i].t&&f[i-1][j-bg[i].l]+bg[i].h>f[i-1][j])   
                        f[i][j]=f[i-1][j-bg[i].l]+bg[i].h;   
                    else  
                        f[i][j]=f[i-1][j];   
            int ans=f[n][1];   
            for(i=2;i<=bg[n].t;++i)   
                if(f[n][i]>ans)   
                    ans=f[n][i];   
            printf("%d\n",ans);  
        }   
        return 0;   

    展开全文
  • ZWG-28DP高性能GPRS/SMS数传模块应用简介pdf,该文档主要介绍了ZWG-28DP高性能GPRS/SMS数传模块应用:GPRS作为主流的通信方式可以轻松应对大部分应用,但是其美中不足之处在于,这种基于IP网络的传输方式需要有固定的...
  • 2021-01-28

    2021-01-28 00:22:20
    区间DP 题目描述 开始你有一个空白字符串,每次可以选择一段区间[l,r]进行涂色,问最少涂色几次会形成字符串s。 注意:涂色会覆盖。 样例输入: AABCBA 样例输出 3 这是区间dp比较经典的一个写法。 memset(dp,inf,...
  • DP yyds!DP\ yyds!DP yyds! 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。-百度百科 然而这也是动态规划的本质,...
  • 题目链接:https://codeforces.com/contest/28/problem/C #include <iostream> #include <algorithm>...db dp[MAXN][MAXN][MAXN]; int a[MAXN]; db C[MAXN][MAXN]; int n,m; void init() {
  • 2020-08-28

    2020-08-28 10:32:44
    //dp[i]=x表示当目标金额为i时。至少需要x枚硬币 public class Test6 { public static int coinChange(int[] coins, int amount) { int[] dp = new int[amount+1]; Arrays.fill(dp, amount+1); dp[0]=0; f
  • 2020-03-28

    2020-03-28 13:51:17
    曾经因为dp没做完退出来ACM,现在却还是因为dp做题到崩溃????????
  • 2020-09-28

    2020-09-28 19:06:42
    博弈: 题目链接:博弈打表入门题 思路:先打表找规律。 ///打表找规律代码: ...char dp[1005][1005]; int main() { int n, m, k; scanf("%d%d%d", &n, &m, &k); dp[n][m] = '#';
  • 27-28cf

    2021-04-28 16:28:24
    27-28cf Distance in Tree 这两天只做了一题,因为这一题牵扯到一个新的知识点 题意 给一颗树,问距离为k的有几个不同的点对 解法一:树形DP 代码量少,好理解,好码 注意一般情况下,dp[i][j]代表到i这个点距离为j...
  • PREV-28 地宫取宝(DP

    2020-05-21 13:55:37
    蓝桥杯 历届试题 PREV-28 地宫取宝 题目 思路 代码 题目传送门 题解思路参考大佬 题解思路参考大佬 题解思路参考大佬 题目 X 国王有一个地宫宝库。是 n×mn \times mn×m 个格子的矩阵。每个格子放一件宝贝。每个...
  • 1.记dp[i][j][a][b]dp[i][j][a][b]dp[i][j][a][b]为走到坐标为(i,j)(i,j)(i,j)位置后,手上有aaa件物品且所有物品中最大值为bbb的方案数; 2.假设我们现在从(a,b)(a,b)(a,b)走到(x,y)(x,y)(x,y)(这两个...
  • PM2-LH10,GL-N12F,EX-28A,CX-411

    千次阅读 2009-11-18 13:13:00
    《 深圳市奥利达电子有限公司0755-33062301 13725594551梁生》特价供应FX-301,CN-73-C1,PM-L44,PM-T44,PM-K44CN-73-C1、CN-73-C2、DP2-22、FD-FM2、FD-G4、FD-S80、FT-KV8、FT-NFM2S4 、FX-301B、FX-301、FX3-A3...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,110
精华内容 444
关键字:

dp-28