• 3月13号周练——2015 Multi-University Training Contest 9


    2015 Multi-University Training Contest 9

    A. Expression(理解原理 区间DP

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<iostream>
    #include<vector>
    #include<queue>
    #include<cmath>
    #define maxn 105
    #define mod 1000000007
    using namespace std;
    long long dp[maxn][maxn];
    long long A[maxn],C[maxn][maxn];
    char operations[maxn];
    int a[maxn],n;
    /*初始化从0到maxn的阶乘模mod*/
    void init()
    {
        int i,j;
        A[0] = 1;
        for(i = 1;i < maxn; i++)
        {
            A[i] = (A[i-1]*i)%mod;
        }
        C[0][0] = 1;
        for(i=1; i<=100; i++)
        {
            C[i][0] = 1;
            for(j=1; j<=i; j++)
                C[i][j] = (C[i-1][j-1] + C[i-1][j])%mod;
        }
    }
    void solve()
    {
        int len,l,r,k;
        for(l = 1;l <= n;l ++)
            dp[l][l] = a[l];
        for(len = 2;len <= n;len ++)
        {
            for(l = 1;l + len - 1 <= n; l ++)
            {
                long long t;
                r = l + len -1;
                for(k = l;k < r;k ++)
                {
                    if(operations[k] == '+'){
                        t = (dp[l][k]*A[r-k-1] + dp[k+1][r]*A[k-l])%mod;
                    }
                    else if(operations[k] == '-'){
                        t = (dp[l][k]*A[r-k-1] - dp[k+1][r]*A[k-l])%mod;
                    }
                    else{
                        t = (dp[l][k]* dp[k+1][r])%mod;
                    }
                    dp[l][r] = (dp[l][r] + t* C[r-l-1][k-l])%mod;
                }
            }
        }
    }
    int main()
    {
        init();
        while(cin >> n)
        {
            memset(dp, 0, sizeof(dp));
            int i,j;
            for(i = 1;i <= n;i ++){
                cin >> a[i];
            }
            for(i = 1;i < n;i ++){
                cin >> operations[i];
            }
            solve();
            cout << (dp[1][n]+mod)%mod << endl;              //此段代码借鉴的,为什么?
        }
        return 0;
    }

    小结:此题看过题解后,思路是对的,但是对取模的机制和组合数的求法不是很熟练,需要加强。

    Travelling Salesman Problem

    #include <iostream>
    #include<cstdio>
    #define maxn 105
    #define black 1
    #define white 0
    using namespace std;
    int n,m;
    long long sum,min;
    int map[maxn][maxn],color[maxn][maxn];    //color[][] = 0/1,1代表白色,0代表黑色
    void init()
    {
        int i ,j;
        bool tmp = true;
        for(i = 1;i <= n;i ++)
        {
                for(j = 1;j <= m;j ++)
                {
                        if(tmp)
                            color[i][j] = black;
                        else
                            color[i][j] = white;
                        tmp = !tmp;
                }
        }
    }
    int main()
    {
        while(scanf("%d %d",&n,&m)!=EOF)
        {
                init();
                sum = 0;
                int i,j;
                for(i = 1;i <= n;i ++)
                {
                    for(j = 1;j <= m;j ++)
                    {
                        scanf("%d",&map[i][j]);
                        sum += map[i][j];
                    }
                }
                    /*行数n为奇数*/
                    if(n%2!=0)
                    {
                        printf("%lld
    ",sum);
                        for(i = 1;i <= n;i ++)
                        {
                            if(i%2 != 0)
                            {
                                for(j = 1;i < m;i ++)
                                    printf("R");
                            }
                            else
                            {
                                    printf("D");
                                    for(j= 1;j < m;j ++)
                                            printf("L");
                            }
                        }
                    }
                    /*行数为偶数,但列数为奇数*/
                    else if(m%2 !=  0)
                    {
                            printf("%lld
    ",sum);
                            for(i = 1;i <= m;i ++)
                            {
                                    if(i%2 != 0)
                                    {
                                            for(j = 1;i < n;i ++)
                                            printf("D");
                                    }
                                    else
                                    {
                                            printf("L");
                                            for(j= 1;j < n;j ++)
                                                    printf("U");
                                    }
                            }
                    }
                    /*行列都为偶数*/
                    else
                    {
                            
                    }
            }
            return 0;
    }
  • 相关阅读:
    eclipse export runnable jar(导出可执行jar包) runnable jar可以执行的
    mave常用指令
    771. Jewels and Stones珠宝数组和石头数组中的字母对应
    624. Maximum Distance in Arrays二重数组中的最大差值距离
    724. Find Pivot Index 找到中轴下标
    605. Can Place Flowers零一间隔种花
    581. Shortest Unsorted Continuous Subarray连续数组中的递增异常情况
    747. Largest Number At Least Twice of Others比所有数字都大两倍的最大数
    643. Maximum Average Subarray I 最大子数组的平均值
    414. Third Maximum Number数组中第三大的数字
  • 原文地址:https://www.cnblogs.com/zhangjialu2015/p/5272208.html
Copyright © 2020-2023  润新知