//区间DP#define _CRT_SECURE_NO_WARNINGS#include#define LL long long#define mem(x,y) memset(x,y,sizeof(x))constint maxn =1e2+7;constint mod =1e9+7;usingnamespace std;namespace needs {template<typename T>inlinevoidread(T& ans){T x =0, f =1;char c =getchar();while(c <'0'|| c>'9'){if(c =='-') f =-1; c =getchar();}while(c >='0'&& c <='9') x =(x <<1)+(x <<3)+ c -'0', c =getchar();ans = f * x;}inlinevoidread(string& st1){char ch =getchar(); st1 ="";while(!((ch >='a')&&(ch <='z'))) ch =getchar();while((ch >='a')&&(ch <='z')) st1 += ch, ch =getchar();}}usingnamespace needs;int date[maxn],dp[maxn][maxn];//i,j;表示以i为起始点到j位置所需要的最少步数intmain(){int n, k;read(n),read(k);mem(dp,0);for(int i =1; i <= n;++i)read(date[i]), dp[i][i]=1;//初始化for(int len =2; len <= n;++len)//枚举区间的长度for(int i =1; i <= n - len +1;++i)//枚举区间的起始点{int j = i + len -1;//根据长度和起始点计算结束点dp[i][j]= dp[i +1][j]+1;//假设date[i]!=date[j],所以扩张一个长度,需要dp[i+1][j]+1,//答案会在断点枚举的时候验证,更新if(k >= len)//刷子长度小于区间的长度for(int k = i +1; k <= j;++k)//枚举断点{if(date[i]== date[k]) dp[i][j]=min(dp[i][j], dp[i +1][k]+ dp[k +1][j]);}//更新答案// 如若date[i] == date[k],且刷子长度够长,//则粉刷date[i+1][k]的时候等同于粉刷date[i][k],//但此时date[i][k]无意义,所以答案要从datep[i+1][k]中更新,//最后在加上断点后区间所需的步数进行更新即可else//区间太长,分割区间,枚举断点,更新答案for(int k = i +1; k <= j;++k)dp[i][j]=min(dp[i][j], dp[i][k]+ dp[k +1][j]);}printf("%d\n", dp[1][n]);//圆满落幕return0;}
//区间DP#define _CRT_SECURE_NO_WARNINGS#include#define LL long long#define mem(x,y) memset(x,y,sizeof(x))constint maxn =2e2+7;constint mod =1e9+7;usingnamespace std;namespace needs {template<typename T>inlinevoidread(T& ans){T x =0, f =1;char c =getchar();while(c <'0'|| c>'9'){if(c =='-') f =-1; c =getchar();}while(c >='0'&& c <='9') x =(x <<1)+(x <<3)+ c -'0', c =getchar();ans = f * x;}inlinevoidread(string& st1){char ch =getchar(); st1 ="";while(!((ch >='a')&&(ch <='z'))&&!((ch >='A')&&(ch <='Z'))) ch =getchar();while(((ch >='a')&&(ch <='z'))||((ch >='A')&&(ch <='Z'))) st1 += ch, ch =getchar();}}usingnamespace needs;bool dp[maxn][maxn][5], is[5][5][5];//dp[i][j][k]表示区间[i , j]是否是由k转化而来的 ,is[i][j][k]表示i是否可以用 j , k 两个字母代替int n[5];intgetnum(char date)//求字母对应的数字{if(date =='W')return1;if(date =='I')return2;if(date =='N')return3;if(date =='G')return4;}intmain(){mem(dp,false),mem(is,false);//初始化for(int i =1; i <=4;++i)read(n[i]);//读入种类for(int i =1; i <=4;++i)for(int j =1; j <= n[i];++j){char x, y;x =getchar(), y =getchar(),getchar();is[i][getnum(x)][getnum(y)]=true;// 根据题意,读入数据,数字i对应的字母可以由x,y转换而来,标记为true}string date;read(date);//读入名字int length =(int)date.size();date =' '+ date;//防止下标-1的出现,后移for(int i =1; i <= length;++i) dp[i][i][getnum(date[i])]=true;//每个字母都可以转成自己,例如:W->Wfor(int len =2; len <= length;++len)//枚举区间长度for(int i =1; i <= length - len +1;++i)//枚举区间起始点for(int k = i, j = i + len -1; k < j;++k)//计算区间结束点j,枚举区间断点for(int z =1; z <=4;++z)//枚举转化字母for(int z1 =1; z1 <=4;++z1)//枚举被转化字母for(int z2 =1; z2 <=4;++z2)//枚举被转化字母if(is[z][z1][z2]&& dp[i][k][z1]&& dp[k +1][j][z2])//字母z可以由z1和z2转化而来,同时可以找到断点左区间可以由z1转化,//右区间可以由z2转化,等效替代,得出总区间可以由z转化而来dp[i][j][z]=true;bool tag =false;if(dp[1][length][1])printf("W"), tag =true;if(dp[1][length][2])printf("I"), tag =true;if(dp[1][length][3])printf("N"), tag =true;if(dp[1][length][4])printf("G"), tag =true;if(!tag)printf("The name is wrong!");//输出结束return0;}
#define _CRT_SECURE_NO_WARNINGS#includeconstint maxn =(int)5e3+7;constint mod =(int)1e9+3;usingnamespace std;namespace tools {#define ll long long#define mem(x,y) memset(x,y,sizeof(x))#define pii pair#define pai 3.141592653589793#define io ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)const ll INF =0x3f3f3f3f3f3f3f3f;constint inf =0x3f3f3f3f;usingnamespace std;template<typename T>inline T tmax(T x, T y, T z){returnmax(x,max(y, z));}template<typename T>inline T tmin(T x, T y, T z){returnmin(x,min(y, z));}template<typename T>inlinevoiddebug(T x, T y){ cout << x <<" "<< y << endl;}template<typename T>inlinevoiddebug(T x){ cout << x << endl;}template<typename T>inlinevoidwrite(T x){if(x <0) x =~x +1,putchar('-');if(x >9)write(x /10);putchar(x %10+'0');}template<typename T>inlinevoidprint(T x){write(x);putchar('\n');}template<typename T>inlinevoidread(T& ans){T x =0, f =1;char c =getchar();while(c <'0'|| c>'9'){if(c =='-') f =-1; c =getchar();}while(c >='0'&& c <='9') x =(x <<1)+(x <<3)+ c -'0', c =getchar(); ans = f * x;}inline ll read(){ll s =0, bj =0;char ch =getchar();while(ch <'0'|| ch>'9')bj |=(ch =='-'), ch =getchar();while(ch >='0'&& ch <='9')s =(s <<1)+(s <<3)+(ch ^48), ch =getchar();return bj ?-s : s;}}usingnamespace tools;int dp[maxn][maxn], date[maxn], ans[maxn][maxn], n, t;intmain(){read(n);for(int i =1; i <= n;++i)read(date[i]), dp[i][i]= ans[i][i]= date[i];for(int i =2; i <= n;++i)for(int l =1, r; r = l + i -1, l <= n - i +1;++l)ans[l][r]= ans[l +1][r]xor ans[l][r -1], dp[l][r]=tmax(ans[l][r], dp[l +1][r], dp[l][r -1]);read(t);while(t--)print(dp[read()][read()]);return0;}