dp

 

链接:https://ac.nowcoder.com/acm/problem/14701
来源:牛客网

题目描述

给定两个长度为n的整数列A和B,每次你可以从A数列的左端或右端取走一个数。假设第i次取走的数为a x,则第i次取走的数的价值v i=b i⋅a x,现在希望你求出∑v i的最大值。
 
区间dp 固定一段跳,不断放大
#include
#include
#include
using namespace std;
typedef long long ll;
const int N=2e5+2;
typedef long long ll;
const ll inf=1e18;
ll dp[1050][1050],q[N],b[N];
int main()
{
    int t;cin>>t;
    while(t--)
    {
     memset(dp,0,sizeof(dp));
        int n;cin>>n;
        for(int i=0;i>q[i];
        for(int i=0;i>b[i];
        for(int i=0;i1];
        for(int i=n-1;i>=0;i--)
        {
            for(int j=i+1;j<=n-1;j++)
            {
                dp[i][j]=max(dp[i+1][j]+q[i]*b[n-(j-i)-1],dp[i][j-1]+q[j]*b[n-(j-i)-1]);
            }
        }
        printf("%d\n",dp[0][n-1]);

    }
}

链接:https://ac.nowcoder.com/acm/problem/13230
来源:牛客网

输入两个字符串A和B,合并成一个串C,属于A和B的字符在C中顺序保持不变。如"abc"和"xyz"可以被组合成"axbycz"或"abxcyz"等。
我们定义字符串的价值为其最长回文子串的长度(回文串表示从正反两边看完全一致的字符串,如"aba"和"xyyx")。
需要求出所有可能的C中价值最大的字符串,输出这个最大价值即可

区间dp  俩个轮流跳

#include
#include
#include
using namespace std;
typedef long long ll;
const int N=2e5+2;
typedef long long ll;
const ll inf=1e18;
ll dp[52][52][52][52],q[N],b[N];
int main()
{
   int t,ans=0,n,m;
   cin>>t;
   while(t--)
   {
       ans=0;
       char a[N],b[N];
       scanf("%s",a+1); n=strlen(a+1);
       scanf("%s",b+1); m=strlen(b+1);
       for(int d1=0;d1<=n;d1++)
        for(int d2=0;d2<=m;d2++)
        for(int i=1,j=d1;j<=n;i++,j++)
            for(int k=1,l=d2;l<=m;l++,k++)
        {
            if(d1+d2<=1) dp[i][j][k][l]=1;
            else
            {
                dp[i][j][k][l]=0;
                if(a[j]==a[i]&&d1>1)
                {
                    if(dp[i+1][j-1][k][l]) dp[i][j][k][l]=1;
                }
                if(a[j]==b[k]&&d1&&d2)
                {
                    if(dp[i][j-1][k+1][l]) dp[i][j][k][l]=1;
                }
                if(b[l]==a[i]&&d1&&d2)
                {
                    if(dp[i+1][j][k][l-1]) dp[i][j][k][l]=1;
                }
                if(b[l]==b[k]&&d2>1)
                {
                    if(dp[i][j][k+1][l-1]) dp[i][j][k][l]=1;
                }
            }
            if(dp[i][j][k][l]) ans=max(ans,d1+d2);
        }
        cout<endl;
   }
   return 0;
}

 

你可能感兴趣的:(dp)