[HDU]week7

1000.A + B Problem

#include<stdio.h>
int main(){
    
    
    int a,b;
    while(~scanf("%d %d",&a,&b)){
    
    
        printf("%d\n",a+b);
    }
    return 0;
}

1243.反恐训练营

#include <iostream>
#include <stdlib.h>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <map>

using namespace std;
char s1[50];
char s2[2500];
char s3[2500];
int dp[2500][2500];
int n;
map<char,int>Map;//key-value:类型-分数 
int main()
{
    
    
    int a;
    while(scanf("%d",&n)!=EOF)
    {
    
    
        scanf("%s",s1);//S1-存储罪犯类型 
        for(int i=0;i<n;i++)
        {
    
    
            scanf("%d",&a);
            Map[s1[i]]=a;//value-罪犯分数 
        }
        scanf("%s%s",s2+1,s3+1);//s2:存储子弹序列;s3:存储罪犯序列 
        int len2=strlen(s2+1);
        int len3=strlen(s3+1);
        //初始化 
        for(int i=0;i<=len2;i++)
            dp[i][0]=0;
        for(int j=0;j<=len3;j++)
            dp[0][j]=0;
        //动态规划 
        /*
		  dp[i][j]=dp[i-1][j-1]+scores[i-1]
		  dp[i][j]=max(dp[i-1][j], dp[i][j-1])
		*/ 
        for(int i=1;i<=len2;i++)
        {
    
    
            for(int j=1;j<=len3;j++)
            {
    
    
                if(s2[i]==s3[j])
                    dp[i][j]=dp[i-1][j-1]+Map[s3[j]];
                else
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
            }
        }
        printf("%d\n",dp[len2][len3]);
    }
}

1494.跑跑卡丁车

参考1参考2

#include <iostream>
#include <stdlib.h>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <map>

using namespace std;
/*
动态规划问题,本题有15个状态,
无加速卡能量0%,无加速卡能量20%,无加速卡能量40%,无加速卡能量60%,无加速卡能量80%。
1张加速卡能量0%,1张加速卡能量20%,1张加速卡能量40%,1张加速卡能量60%,1张加速卡能量80%。
2张加速卡能量0%,2张加速卡能量20%,2张加速卡能量40%,2张加速卡能量60%,2张加速卡能量80%
分别记为0-14
dp[i][j],表示在第i段赛道第j个状态时的最小用时。a[i]表示通过第i个赛道的普通用时,b[i]表示通过第i个赛道的加速用时。
可以写出状态转移方程:
(1)如果不是初始状态,那么j = 0的时候,刚刚用了加速卡
dp[i][j] = dp[i-1][5] + b[i] 
(2)j > 10时:不可能在之前的一段赛道获得加速卡,因为j最大只有14
dp[i][j] = dp[i-1][j-1]+a[i]
(3)j = 10时:可能j=14的时候-5了,或者j = 9的时候获得了第二张加速卡
dp[i][j] = Min(dp[i-1][9]+a[i], dp[i-1][14]+a[i])
(4)j < 10时:可能是前面没有用加速卡,或者是前面用了加速卡。
dp[i][j] = Min(dp[i-1][j-1]+a[i], dp[i-1][j+5]+b[i])
*/
#define MAX 99999999
int a[10010], b[10010];
int dp[10010][15];//dp[i][j],表示在第i段赛道第j个状态时的最小用时。
int main(){
    
    
	int L,N;
	while(scanf("%d%d",&L,&N)!=EOF){
    
    
		for(int i = 1;i <= L;i++)	scanf("%d", &a[i]);
		for(int i = 1;i <= L;i++)	scanf("%d", &b[i]);
		for(int i = L+1; i <=L*N; i++){
    
    
			a[i] = a[i-L];
			b[i] = b[i-L];
		}
		//初始化 
		memset(dp,0,sizeof(dp));
		for(int i = 1;i <= 14; i++)	dp[0][i] = MAX;
		for(int i = 1;i <= L*N; i++){
    
    
			for(int j = 0;j <= 14; j++){
    
    
				if(j == 0) dp[i][j] = dp[i-1][5] + b[i];
				else if(j < 10) dp[i][j] = min(dp[i-1][j-1]+a[i], dp[i-1][j+5] + b[i]);
				else if(j == 10) dp[i][j] = min(dp[i-1][9]+a[i], dp[i-1][14]+a[i]);
				else if(j > 10) dp[i][j] = dp[i-1][j-1]+a[i];
			}
		} 
		int min=MAX;
		for(int i = 0;i <= 14; i++){
    
    
			if(min>dp[N*L][i])
				min=dp[N*L][i];	
		}
		printf("%d\n", min);
	}
	
	return 0;
}

1559.最大子矩阵

暴力参考
参考

#include<bits/stdc++.h>
using namespace std;
int dp[1010][1010];
int main()
{
    
    
    int T;
    cin>>T;
    while(T--)
    {
    
    
        int n,m,x,y,i,j,sum=0;
        cin>>n>>m>>x>>y;
        memset(dp,0,sizeof(dp));
        for(i=1; i<=n; i++)
            for(j=1; j<=m; j++)
            {
    
    
                cin>>dp[i][j];
                dp[i][j]+=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1];
                if(i>=x&&j>=y)
                {
    
    
                    sum=max(sum,dp[i][j]-dp[i-x][j]-dp[i][j-y]+dp[i-x][j-y]);
                }
            }
        cout<<sum<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/Jingle_dog/article/details/121296764