dp先想清楚数组中i和j分别代表的是什么意思
想清楚属性
想清楚集合大圆的画法
1050.鸣人的影分身
f[i][j] i的重量分为j个数字
分为有没有0,有零的是f[i][j-1],无0的是f[i-j][j]
1047.糖果
选择型的DP,背包问题一般i表示前i个物品,j在这个题中表示的余数,余数这里要特殊的处理一下,余数要是大于0的余数
这里f[0][n]除了f[0][0]以外都是没有意义的,所有要将其设置为负无穷
前两为线性DP
区间Dp1222.密码脱落
是一个区间dp先循环的是区间长度,再循环一个数
f[L][R]所有L到R之间的回文序列长度最大的一个
#include<iostream>
#include<string.h>
using namespace std;
const int N = 1010;
char s[N];
int f[N][N];
int main()
{
scanf("%s",s);
int n = strlen(s);
for(int len=1;len<=n;len++)
{
for(int l=0;l+len-1<=n;l++)
{
int r = l+len-1;
if(len==1) f[l][r]=1;
else
{
if(s[r]==s[l]) f[l][r] = f[l+1][r-1] + 2;//都在里面
if(f[l+1][r]>f[l][r]) f[l][r] = f[l+1][r];//取的都是包含的情况
if(f[l][r-1]>f[l][r]) f[l][r] = f[l][r-1];
}
}
}
cout<<n-f[0][n-1];
return 0;
}
可以重复的
区间dp石子合并问题
划分是根据的是寻找中中间的一个数来进行划分的
区间DP循环一个区间长度,再循环左端点
区间dp的函数意义一般是在这个区间中题目要求的值
Sto Orz %%%