题意:给出一个长字符串,再给一个短字符串,进行匹配,如果第i个恰好匹配,则 +8,;如果不匹配,可以给长或短字符串添加-,先后匹配,这样-3,

连续的长字符串添加-,需要减去一个4;也可不给添加-,则-5。

析:dp[i][j][0] 表示第一个字符串第 i 个位置,和第二个字符串的第 j 个位置相匹配,dp[i][j][1] 表示第一个字符串第 i 个位置,和第二个字符串的第 j 个位置加_相匹配.

那么怎么转移呢?如果s1[i] == s2[j] 那么 dp[i+1][j+1][0] = Max(dp[i+1][j+1][0], Max(dp[i][j][0], dp[i][j][1])+8);意思就是匹配的加8分,

如果不相等,dp[i+1][j+1][0] = Max(dp[i+1][j+1][0], Max(dp[i][j][0], dp[i][j][1])-5);不匹配,减 5 呗。

dp[i][j+1][1] = Max(dp[i][j+1][1], Max(dp[i][j][0]-7, dp[i][j][1]-3));
dp[i+1][j][1] = Max(dp[i+1][j][1], Max(dp[i][j][0]-7, dp[i][j][1]-3));

同样的意思。注意,这个题说学生的串不过50,但是你开小于100就会WA。。。。真坑啊

代码如下:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <set>
#include <queue>
#include <algorithm>
#include <vector>
#include <map>
#include <cctype>
#include <cmath>
#include <stack>
#define freopenr freopen("in.txt", "r", stdin)
#define freopenw freopen("out.txt", "w", stdout)
using namespace std; typedef long long LL;
typedef pair<int, int> P;
const int INF = 0x3f3f3f3f;
const double inf = 0x3f3f3f3f3f3f;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int maxn = 1e6 + 5;
const int mod = 1e8;
const char *mark = "+-*";
const int dr[] = {-1, 0, 1, 0, 1, 1, -1, -1};
const int dc[] = {0, 1, 0, -1, -1, 1, 1, -1};
int n, m;
const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
inline int Min(int a, int b){ return a < b ? a : b; }
inline int Max(int a, int b){ return a > b ? a : b; }
inline LL Min(LL a, LL b){ return a < b ? a : b; }
inline LL Max(LL a, LL b){ return a > b ? a : b; }
inline bool is_in(int r, int c){
return r >= 0 && r < n && c >= 0 && c < m;
}
char s1[110], s2[110];
int dp[110][110][2]; int main(){
int T; cin >> T;
while(T--){
scanf("%s", s1); scanf("%s", s2);
int len1 = strlen(s1);
int len2 = strlen(s2);
for(int i = 0; i <= len1; ++i)
for(int j = 0; j <= len2; ++j)
for(int k = 0; k < 2; ++k)
dp[i][j][k] = -INF; for(int i = 0; i <= len1; ++i) dp[i][0][0] = 0;
for(int i = 0; i < len1; ++i){
for(int j = 0; j < len2; ++j){
if(s1[i] == s2[j]) dp[i+1][j+1][0] = Max(dp[i+1][j+1][0], Max(dp[i][j][0], dp[i][j][1])+8);
else dp[i+1][j+1][0] = Max(dp[i+1][j+1][0], Max(dp[i][j][0], dp[i][j][1])-5); dp[i][j+1][1] = Max(dp[i][j+1][1], Max(dp[i][j][0]-7, dp[i][j][1]-3));
dp[i+1][j][1] = Max(dp[i+1][j][1], Max(dp[i][j][0]-7, dp[i][j][1]-3));
}
} int ans = -INF;
for(int i = 0; i <= len1; ++i)
ans = Max(ans, Max(dp[i][len2][0], dp[i][len2][1]));
printf("%d\n", ans);
}
return 0;
}

UVaLive 6697 Homework Evaluation (DP)的更多相关文章

  1. UVAlive 6697 Homework Evaluation

    借鉴了别人的博客啊,自己写写给以后的自己看吧 给出两个字符串,用第二个字符串去匹配第一个字符串,可以对第二个字符串进行删除或插入操作,一位匹配成功得8分失败-5分,如果插入或删除,对于连续插入或删除m ...

  2. HDU 1074 Doing Homework (dp+状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:学生要完成各科作业, 给出各科老师给出交作业的期限和学生完成该科所需时间, 如果逾期一 ...

  3. HDU3693 Math Teacher's Homework ---- 数位DP

    HDU3693 Math Teacher's Homework 一句话题意 给定$n, k以及m_1, m_2, m_3, ..., m_n$求$x_1 \oplus x_2 \oplus x_3 \ ...

  4. UVALive - 6952 Cent Savings dp

    题目链接: http://acm.hust.edu.cn/vjudge/problem/116998 Cent Savings Time Limit: 3000MS 问题描述 To host a re ...

  5. UVALive - 6529 找规律+dp

    题目链接: http://acm.hust.edu.cn/vjudge/problem/47664 Eleven Time Limit: 5000MS 问题描述 In this problem, we ...

  6. UVaLive 6801 Sequence (计数DP)

    题意:给定一个序列,有 n 个数,只有01,然后你进行k次操作,把所有的1变成0,求有多种方法. 析:DP是很明显的,dp[i][j] 表示进行第 i 次操作,剩下 j 个1,然后操作就两种,把1变成 ...

  7. UVaLive 7374 Racing Gems (DP,LIS)

    题意:以辆赛车可以从x轴上任意点出发,他的水平速度允许他向每向上移动v个单位,就能向左或向右移动v/r个单位(也就是它的辐射范围是个等腰三角形) 现在赛车从x轴出发,问它在到达终点前能吃到的最多钻石. ...

  8. UVALive 6947 Improvements(DP+树状数组)

    [题目链接] https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=sho ...

  9. HDU 1074 Doing Homework(DP状态压缩)

    题意:有n门功课需要完成,每一门功课都有时间期限以及你完成所需要的时间,如果完成的时间超出时间期限多少单位,就会被减多少学分,问以怎样的功课完成顺序,会使减掉的学分最少,有多个解时,输出功课名字典序最 ...

随机推荐

  1. UVa 1395 Slim Span【最小生成树】

    题意:给出n个节点的图,求最大边减最小边尽量小的值的生成树 首先将边排序,然后枚举边的区间,判定在该区间内是否n个点连通,如果已经连通了,则构成一颗生成树, 则此时的苗条度是这个区间内最小的(和kru ...

  2. memcached缓存雪崩现象及解决办法

    1)什么是缓存雪崩?场景:一个访问很大的文章(论坛之类)的网站,使用memcached缓存用户查询过的文章.设置的缓存过期时间为6小时,所以没过6小时,缓存就会失效并重建一遍 问题:过六小时时,一部分 ...

  3. mongodb主从复制

    1)主服务器--master --port 20001 2)从服务器--slave --source 127.0.0.1:20001 --port 20002 注释:--master 以主服务器形式启 ...

  4. LA 3882 And Then There Was One

    解题思路:分析要好久,懒得分析了,贴了某大牛的的分析,代码就是我自己写的. N个数排成一圈,第一次删除m,以后每k个数删除一次,求最后一被删除的数. 如果这题用链表或者数组模拟整个过程的话,时间复杂度 ...

  5. 部署在IIS服务器的asp.net 网站,禁止访问指定类型文件

    网站上的一些文件不希望用户访问,可以通过下面的方式简单实现.不需写代码(在IIS6下试验过). 第一步,在IIS中实现映射. 哪些文件需要特殊处理. 通俗的将就是将哪种类型的文件交给特定的工厂来处理. ...

  6. mysql 表日常变化前几

    mysql 表日常变化前几use performance_schema create table test.snap1 as SELECT OBJECT_SCHEMA, OBJECT_NAME, CO ...

  7. Java反射基本玩法

    三个主要的反射类 Class反射对象描述类语义结构,可以从Class对象中获取构造函数.成员变量.方法类等元素的反射对象,并以编程的方式通过这些反射对象对目标类对象进行操作.这些反射对象类在java. ...

  8. unity, setting standard shader by script

    http://forum.unity3d.com/threads/change-standard-shader-render-mode-in-runtime.318815/

  9. NoSQL架构实践(一)——以NoSQL为辅

    前面<为什么要使用NoSQL>和<关系数据库还是NoSQL数据库>两篇从大体上介绍了为什么要用NoSQL,何时该用NoSQL.经常有朋友遇到困惑,看到NoSQL的介绍,觉得很好 ...

  10. mysql 查询随机条记录的sql语句和php计算概率

    最近在网上找了下mysql查询随机的几个sql,我把最终的记录下来. SELECT * FROM uchome_mtag AS a JOIN (SELECT MAX(tagid) AS id FROM ...