HDU_5115 Dire Wolf
2015-10-10 16:35
155 查看
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5115
题意:
有n只狼,每只狼有两种属性,一种攻击力一种附加值,我们没杀一只狼,那么我们受到的伤害值为
这只狼的攻击值与它旁边的两只狼的附加值的和,求把所有狼都杀光受到的最小的伤害值。
分析:
dp[i][j]表示把区间i,j内的所有狼杀光所受到的最小的伤害。
状态转移方程为
dp[i][j]=min{dp[i][k]+dp[k+1][j]-b[k]+b[i+1],dp[i][k]+dp[k+1][j]-b[k+1]+b[j+1]}(i<=k<j)这里讨论了先杀左边的还是先杀右边的
处理的时候要注意a[0],b[0],a[n+1],b[n+1]的初值都是0.
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn=220;
#define INF 0x3f3f3f3f
int a[maxn],b[maxn],dp[maxn][maxn];
int main()
{
int T;
scanf("%d",&T);
int kcase=1;
while(T--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
a[0]=a[n+1]=b[0]=b[n+1]=0;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
dp[i][j]=INF;
for(int i=1;i<=n;i++)
dp[i][i]=a[i]+b[i-1]+b[i+1];
for(int len=2;len<=n;len++)
{
for(int i=1;i+len-1<=n;i++)
{
int j=i+len-1;
for(int k=i;k<j;k++)
{
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+b[i-1]-b[k]); //先杀左边
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+b[j+1]-b[k+1]); //先杀右边
}
}
}
printf("Case #%d: %d\n",kcase++,dp[1]
);
}
return 0;
}
http://acm.hdu.edu.cn/showproblem.php?pid=5115
题意:
有n只狼,每只狼有两种属性,一种攻击力一种附加值,我们没杀一只狼,那么我们受到的伤害值为
这只狼的攻击值与它旁边的两只狼的附加值的和,求把所有狼都杀光受到的最小的伤害值。
分析:
dp[i][j]表示把区间i,j内的所有狼杀光所受到的最小的伤害。
状态转移方程为
dp[i][j]=min{dp[i][k]+dp[k+1][j]-b[k]+b[i+1],dp[i][k]+dp[k+1][j]-b[k+1]+b[j+1]}(i<=k<j)这里讨论了先杀左边的还是先杀右边的
处理的时候要注意a[0],b[0],a[n+1],b[n+1]的初值都是0.
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn=220;
#define INF 0x3f3f3f3f
int a[maxn],b[maxn],dp[maxn][maxn];
int main()
{
int T;
scanf("%d",&T);
int kcase=1;
while(T--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
a[0]=a[n+1]=b[0]=b[n+1]=0;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
dp[i][j]=INF;
for(int i=1;i<=n;i++)
dp[i][i]=a[i]+b[i-1]+b[i+1];
for(int len=2;len<=n;len++)
{
for(int i=1;i+len-1<=n;i++)
{
int j=i+len-1;
for(int k=i;k<j;k++)
{
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+b[i-1]-b[k]); //先杀左边
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+b[j+1]-b[k+1]); //先杀右边
}
}
}
printf("Case #%d: %d\n",kcase++,dp[1]
);
}
return 0;
}
相关文章推荐
- 《探索需求》读书笔记一
- glib移植到ARM上
- qt-opencv配置mingw编译器
- 【小米校招笔试】一个数组是由有序数组经过n次循环移动后所得,请你用最快速度查找某个元素位置
- vi 删除^M
- Android内存优化神器——MAT入门使用
- 《探索需求》读书笔记一
- qt-opencv配置mingw编译器
- C++ 简单的入门语法
- 标准SVD和改进的SVD
- LVS原理以及配置
- C语言消息队列通信函数描述
- C语言消息队列通信函数描述
- Win7系统复制文件时提示“MS-DOS功能无效”的原因及解决方法
- matlab中的sparse和full函数(稀疏矩阵和非稀疏矩阵之间的转换)
- LightOJ 1214 Large Division
- pinyin4j 使用 获取第一个汉子的首字母,获取汉子拼音
- js字符串中出现次数最多的字符
- HTML5 Web SQL 数据库
- 事务的使用(sql server 数据库和C#代码)